ऐसा नहीं है। यह एक सबूत है कि नाशक स्वचालित रूप से आभासी नहीं किया जाता है के करीब है:
#include <iostream>
struct BaseBase {
~BaseBase() {
std::cout << "~BaseBase\n";
}
};
struct Base : BaseBase
{
virtual void foo() = 0;
//~Base(); <-- No destructor!
};
struct Derived : Base {
void foo() { std::cout << "foo\n"; }
~Derived() {
std::cout << "~Derived\n";
}
};
int main() {
Base *p = new Derived();
delete p;
}
इस कार्यक्रम वास्तव में अपरिभाषित है व्यवहार है, लेकिन मैं दृढ़ता से संदेह है कि आपके कार्यान्वयन पर इसे प्रिंट नहीं है "~ व्युत्पन्न" । यदि Base
में वर्चुअल विनाशक था, तो उसके पास अपरिभाषित व्यवहार नहीं होगा, और यह "~ व्युत्पन्न" प्रिंट करेगा।
बेशक यह वास्तव में मानक के बारे में कुछ भी साबित नहीं करता है। किसी भी कार्यान्वयन को आप इसे चलाने के बाद शायद गैर-अनुरूप हो सकते हैं। लेकिन एक बार जब आप इसे कुछ करने की कोशिश कर लेंगे, तो आपको यह विचार मिलेगा कि मानक जो कुछ भी कह सकता है, आपको वर्चुअल विनाशक को निर्दिष्ट करने की आवश्यकता है।
स्रोत
2011-08-12 15:01:23
नहीं, लेकिन मैं आपको मानक के लिए संदर्भ नहीं दे सकता * कहता हूं ... –
यदि केवल कंपाइलर स्टैक ओवरफ्लो पर प्रश्नों का उत्तर दे सकते हैं;) – MerickOWA