वर्चुअल डिस्ट्रक्टर्स तब उपयोगी होते हैं जब आप संभावित रूप से एक पॉइंटर को बेस क्लास के लिए पॉइंटर के माध्यम से हटा सकते हैं:
class Base
{
// some virtual methods
};
class Derived : public Base
{
~Derived()
{
// Do some important cleanup
}
};
यहाँ, आप देखेंगे कि मैंने बेस के विध्वंसक होने की घोषणा नहीं की virtual। अब, निम्नलिखित स्निपेट पर एक नज़र डालते हैं:
Base *b = new Derived();
// use b
delete b; // Here's the problem!
के बाद से बेस नाशक नहीं है virtualऔर bएक है Base*एक करने के लिए इशारा Derivedवस्तु, delete bहै अपरिभाषित व्यवहार :
[में delete b], यदि हटाई जाने वाली वस्तु का स्थैतिक प्रकार उसके गतिशील प्रकार से भिन्न होता है, तो स्थैतिक प्रकार हटाए जाने वाली वस्तु के गतिशील प्रकार का एक आधार वर्ग होगा और स्थैतिक प्रकार में एक आभासी विध्वंसक या होगा व्यवहार अपरिभाषित है ।
अधिकांश कार्यान्वयन में, विध्वंसक को कॉल किसी भी गैर-आभासी कोड की तरह हल किया जाएगा, जिसका अर्थ है कि बेस क्लास के विध्वंसक को बुलाया जाएगा, लेकिन व्युत्पन्न वर्ग में से एक नहीं, जिसके परिणामस्वरूप संसाधन रिसाव होता है।
योग करने के लिए, हमेशा आधार वर्ग के विध्वंसक virtualबनाते हैं जब उनका मतलब बहुरूपिए से छेड़छाड़ करना होता है।
यदि आप बेस क्लास पॉइंटर के माध्यम से इंस्टेंट को हटाने से रोकना चाहते हैं, तो आप बेस क्लास डिस्ट्रक्टर को संरक्षित और गैर-संवैधानिक बना सकते हैं; ऐसा करने से, कंपाइलर आपको deleteबेस क्लास पॉइंटर पर कॉल नहीं करने देगा ।
आप हर्ब सटर के इस लेख में वर्चुअलिटी और वर्चुअल बेस क्लास डिस्ट्रक्टर के बारे में अधिक जान सकते हैं ।