मुझे बेस क्लास Base
के सभी वंशजों के लिए अंतिम विधि finalize()
घोषित करने की आवश्यकता है, जिसे विनाश के दौरान बुलाया जाना चाहिए, और मेरा इरादा ~Base()
से शुद्ध virtual void Base::finalize() = 0
पर कॉल करना था, लेकिन सी ++ ऐसी चीज को रोकता है। तो मेरा सवालविनाशक से वर्चुअल विधि को कॉल करना - वर्कअराउंड?
हम वंशजों को सही और प्रारंभिक परिभाषित तरीके से कुछ अंतिम कार्य करने के लिए कैसे उजागर कर सकते हैं?
कोड संकलित नहीं किया जा सकता है कि:
#include <QDebug>
class Base {
public:
Base(){}
virtual ~Base(){
qDebug("deleting b");
finalize();
}
virtual void finalize() = 0;
};
class A : public Base
{
public:
A(){}
~A(){}
void finalize(){qDebug("called finalize in a");}
};
int main(int argc, char *argv[])
{
Base *b = new A;
delete b;
}
अगर मैं बनाने Base::finalize()
शुद्ध आभासी नहीं है, यह बच्चे के लिए भेजने के बाद से यह पहले से ही विलुप्त कर दिया है बिना ~Base()
से कहा जाता है।
मैं बच्चे के विनाशक से अंतिम() को कॉल कर सकता हूं लेकिन सवाल यह है कि ऐसा करने के लिए मजबूर होना कैसे है। दूसरे शब्दों में मेरा प्रश्न यह है: क्या उन लोगों को त्यागना संभव है जो बेस क्लास के वंशजों को अंतिम रूप देने के तरीके को लिखने के लिए लिखेंगे, ठीक है, एक दस्तावेज में टिप्पणी करने की तुलना में किसी अन्य तरीके से? :)
ठीक है, मैं इसे देखता हूं, लेकिन मेरा सवाल यह है: क्या उन लोगों को त्यागना संभव है जो बेस क्लास के वंशजों को अंतिम रूप देने के तरीके को लिखने के लिए लिखेंगे, ठीक है, किसी अन्य दस्तावेज में टिप्पणी करने के बजाय? :) –
यह संभव है लेकिन आपको कंपाइलर या रन-टाइम त्रुटियां मिल सकती हैं, क्योंकि उस समय तक 'बेस' के विनाशक को बुलाया जाता है, 'ए' के विनाशक को पहले से ही बुलाया गया है, इसलिए कोई 'ए' ऑब्जेक्ट नहीं है जिस पर अपनी तथाकथित 'अंतिमकरण()' विधि को कॉल करने के लिए। –
मैंने आपके नमूना कोड का उपयोग किया है और 'बेस' के लिए 'अंतिमकरण()' परिभाषित किया है, इस प्रकार इसे सादा वर्चुअल (शुद्ध नहीं) बना रहा है। यह संकलित करता है, लेकिन देखें कि आप इसके निष्पादन से क्या प्राप्त करते हैं http://ideone.com/opDXc –