tutorial - the c++ programming language




C++ 'इंटरफेस' में वर्चुअल डिस्ट्रक्टर होना चाहिए (4)

आपको हमेशा इंटरफेस के साथ एक वर्चुअल विध्वंसक का उपयोग करना चाहिए। इसका स्पष्ट उदाहरण:

IAnimal* animal = new Lion();
delete animal;

अब यह किस विध्वंसक उपयोग के लिए जा रहा है? निश्चित रूप से शेर का विनाशकर्ता नहीं है क्योंकि इंटरफ़ेस शेर के विनाशकर्ता के बारे में नहीं जानता है

इसलिए, यदि आपके इंटरफ़ेस में कोई स्मृति प्रबंधन नहीं है:

virtual ~IAnimal(){}

संभव डुप्लिकेट:
C ++ इंटरफ़ेस जैसी कक्षाओं के लिए विध्वंसक

एक इंटरफ़ेस को मॉडल करने के लिए उपयोग किए जाने वाले C ++ सार वर्ग के एक सरल उदाहरण पर विचार करें:

class IAnimal
{
  virtual void walk()=0;
  virtual ~IAnimal(){}
};

विध्वंसक होना बेहतर है या नहीं? मुझे नहीं लगता कि विध्वंसक शुद्ध आभासी हो सकता है, कम से कम मेरे परीक्षण लिंकर त्रुटियों को देते हैं, इसलिए एक खाली विध्वंसक को शामिल किया जाना चाहिए?

संपादित करें: क्षमा करें, टाइपो। यह एक विध्वंसक है न कि एक निर्माता।


एक खाली कंस्ट्रक्टर को संभवतः शामिल किया जाना चाहिए क्योंकि एक इंटरफेस के एक विशिष्ट उपयोग में एक कंटेनर में कुछ ठोस वस्तु के लिए एक पॉइंटर डालना होता है, जो अन्यथा गलत डिस्ट्रक्टर को कॉल करेगा और मेमोरी को सही ढंग से साफ नहीं करेगा। इसलिए यदि कोई किसी ऑब्जेक्ट को व्युत्पन्न करने के लिए इयानिमल के माध्यम से एक आभासी विध्वंसक बनाने जा रहा है, तो अपने विध्वंसक को गैर-संवैधानिक और संरक्षित बनाएं। अपने विध्वंसक को शुद्ध आभासी बनाना शायद इतना अच्छा विचार नहीं है, क्योंकि यह आपके विनाशकर्ता को खत्म करने के लिए व्युत्पन्न वर्गों के कार्यान्वयनकर्ताओं को बाध्य करता है, आखिरकार वे कुछ भी नहीं करना चाहते हैं।


यह इस बात पर निर्भर करता है कि आप इंटरफ़ेस क्लास में पॉइंटर्स का उपयोग करते हुए पॉलीमॉर्फिक रूप से ऑब्जेक्ट्स के जीवनकाल को प्रबंधित करने का इरादा रखते हैं या नहीं।

यदि आप करते हैं, तो ऑब्जेक्ट को सही ढंग से हटाने के लिए, विनाशकारी आभासी होना चाहिए। एक बेस-क्लास पॉइंटर को हटाना जिसके पास वर्चुअल डिस्ट्रक्टर नहीं है, अमान्य है, और अपरिभाषित व्यवहार देता है।

यदि आप नहीं करते हैं, तो आपको इसे विध्वंसक गैर-आभासी और संरक्षित करके लागू करना चाहिए, इसलिए केवल व्युत्पन्न वर्ग को हटाया जा सकता है।


विध्वंसक को आभासी न बनाने का एकमात्र कारण vptr लिए आवश्यक स्थान को बचाना होगा। जैसा कि आपको वैसे भी vptr की आवश्यकता है क्योंकि आपके पास एक और आभासी फ़ंक्शन है, मैं विध्वंसक को आभासी vptr





c++