क्या यह लिखना गलत है:
class A {
public:
virtual ~A() = 0;
};
एक सार आधार वर्ग के लिए?
कम से कम जो MSVC में संकलित है ... क्या यह रन टाइम पर क्रैश होगा?
क्या यह लिखना गलत है:
class A {
public:
virtual ~A() = 0;
};
एक सार आधार वर्ग के लिए?
कम से कम जो MSVC में संकलित है ... क्या यह रन टाइम पर क्रैश होगा?
जवाबों:
हाँ। आपको विध्वंसक को लागू करने की भी आवश्यकता है:
class A {
public:
virtual ~A() = 0;
};
inline A::~A() { }
पर्याप्त होना चाहिए।
और चूंकि यह एक डाउन वोट मिला, मुझे स्पष्ट करना चाहिए: यदि आप ए से कुछ भी प्राप्त करते हैं और फिर इसे हटाने या नष्ट करने का प्रयास करते हैं, A
तो अंततः विनाशकारी कहा जाएगा। चूंकि यह शुद्ध है और इसका कार्यान्वयन नहीं है, अपरिभाषित व्यवहार सुनिश्चित करेगा। एक लोकप्रिय प्लेटफ़ॉर्म पर, जो कि प्योरकॉल हैंडलर और क्रैश को लागू करेगा।
संपादित करें: घोषणा को अधिक अनुरूप बनाने के लिए, http://www.comeaucomputing.com/tryitout/ के साथ संकलित
निजी विध्वंसक: जब आप किसी व्युत्पन्न वर्ग की वस्तु बनाते हैं, तो वे आपको एक त्रुटि देंगे - अन्यथा नहीं। एक निदान हालांकि दिखाई दे सकता है।
12.4 विध्वंसक
6 एक विध्वंसक को आभासी (10.3) या शुद्ध आभासी (10.4) घोषित किया जा सकता है; यदि प्रोग्राम में उस वर्ग या किसी व्युत्पन्न वर्ग की कोई भी वस्तु बनाई जाती है, तो विध्वंसक को परिभाषित किया जाएगा।
शुद्ध आभासी विध्वंसक के साथ एक वर्ग एक अमूर्त वर्ग है। अच्छी तरह से ध्यान दें:
10.4 सार वर्ग
2 एक शुद्ध आभासी फ़ंक्शन को केवल तभी परिभाषित किया जाना चाहिए, जब उसे (12.4), योग्य-आईडी सिंटैक्स (5.1) के साथ कहा जाता है।
[ नोट : एक फ़ंक्शन घोषणा शुद्ध-निर्दिष्ट और परिभाषा-दोनों नोट प्रदान नहीं कर सकती]
ड्राफ्ट से सीधे लिया गया:
struct C {
virtual void f() = 0 { }; // ill-formed
};