2009-05-05 7 views
14

में वर्चुअल डिफॉल्ट डिस्ट्रक्टर्स मुझे विरासत वर्ग (मानदंड) का एक बड़ा सेट मिला है जो बेस क्लास (मानदंड) से प्राप्त होता है।सी ++

class fastFilter : public criterion 
{ 
public: 
    void reorderTree() {}; 
    unsigned int directoryCheck(const std::wstring& /*directory*/) const { return DIRECTORY_DONTCARE; }; 
    unsigned __int32 getPriorityClass() const { return PRIORITY_FAST_FILTER; }; 
}; 

class isArchive : public fastFilter 
{ 
public: 
    BOOL include(fileData &file) const 
    { 
     return file.getArchive(); 
    } 
    std::wstring debugTree() const 
    { 
     return std::wstring(L"+ ISARCHIVE\n"); 
    }; 
}; 

जब से मैं एक नाशक यहाँ बिल्कुल जरूरत नहीं है, लेकिन अभी तक यह एक आधार वर्ग माना जाता है: यहाँ 'criterion रों कोड इस एक से प्राप्त वर्गों के

class criterion 
{ 
public: 
    virtual unsigned __int32 getPriorityClass() const = 0; 
    virtual BOOL include(fileData &file) const = 0; 
    virtual void reorderTree() = 0; 
    virtual unsigned int directoryCheck(const std::wstring& directory) const = 0; 
    virtual std::wstring debugTree() const = 0; 
}; 

कुछ उदाहरण है , क्या मुझे एक खाली वर्चुअल विनाशक डालने की ज़रूरत है, आईई इस ?: तरह

virtual void ~criterion() = 0; 

हैं कि आभासी नाशक घोषणा की आवश्यकता नहीं, सभी मध्यवर्ती वर्ग के रूप में अच्छी तरह से एक की जरूरत है? अर्थात। उपरोक्त तेजी से एक वर्चुअल विनाशक की आवश्यकता होगी?

+0

उपर्युक्त खाली विनाशक नहीं है। यह एक विनाशक है जो शुद्ध वर्चुअल फ़ंक्शन भी है। इसका खाली होने के साथ कुछ लेना देना नहीं है, और वास्तव में विनाशक विशेष है कि इसमें शुद्ध वर्चुअल होने पर भी हमेशा परिभाषा होनी चाहिए। –

उत्तर

37

हां - बेस क्लास को आभासी विनाशक की आवश्यकता होती है, भले ही यह खाली हो। यदि ऐसा नहीं किया जाता है, तो जब कुछ पॉइंटर/संदर्भ के माध्यम से delete एक व्युत्पन्न वस्तु है, तो व्युत्पन्न वस्तु के सदस्य ऑब्जेक्ट्स को स्वयं को ठीक से नष्ट करने का मौका नहीं मिलेगा।

व्युत्पन्न कक्षाओं को अपने स्वयं के विनाशक को घोषित करने या परिभाषित करने की आवश्यकता नहीं है जब तक उन्हें डिफ़ॉल्ट विनाशक व्यवहार के अलावा कुछ और चाहिए।

23

सिफारिश एक आधार वर्ग सूचक समस्या बंद विलोपन से बचने के लिए

virtual ~criterion() {} 

डालने के लिए है। अन्यथा आप स्मृति को रिसाव करेंगे क्योंकि व्युत्पन्न वर्गों के विनाशकों को नहीं बुलाया जाएगा।

criterion *c = new fastFilter(); 
delete c; // leaks 
+1

क्या शुद्ध वर्चुअल पर खाली विनाशक का उपयोग करने का कोई कारण है? –

+0

कभी नहीं ... किसी और ने उत्तर दिया :) –

+1

'वर्चुअल ~ मानदंड() noexcept {}' prettier नहीं है? – user1095108

12

तुम बस यह एक खाली कार्यान्वयन देना नाशक सार बनाने की जरूरत नहीं है,:

virtual ~criterion() { } 

इस तरह आप हर बच्चे को कक्षा में इसे लागू करने के लिए मजबूर नहीं कर रहे हैं में से प्रत्येक, लेकिन अभी भी उनके पास एक (विरासत) वर्चुअल विनाशक होगा।

7

क्या दूसरों को पहले से ही जवाब दे दिया है से एक छोटा सा परिवर्तन:

virtual void ~criterion() = 0; 

आवश्यक संस्करण के बजाय

है:

virtual ~criterion() {} //Note: Removed void as destructors not allowed 
          // a return type 

आभासी नाशक के बारे में अधिक जानकारी के लिए इस पर एक नजर है एफएक्यू से लिंक When should my destructor be virtual?

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^