C ++ में शुद्ध आभासी विध्वंसक


163

क्या यह लिखना गलत है:

class A {
public:
    virtual ~A() = 0;
};

एक सार आधार वर्ग के लिए?

कम से कम जो MSVC में संकलित है ... क्या यह रन टाइम पर क्रैश होगा?


9
यह संकलन हो सकता है, लेकिन क्या यह लिंक करता है?
मिंग डक जूल

जवाबों:


218

हाँ। आपको विध्वंसक को लागू करने की भी आवश्यकता है:

class A {
public:
    virtual ~A() = 0;
};

inline A::~A() { }

पर्याप्त होना चाहिए।

और चूंकि यह एक डाउन वोट मिला, मुझे स्पष्ट करना चाहिए: यदि आप ए से कुछ भी प्राप्त करते हैं और फिर इसे हटाने या नष्ट करने का प्रयास करते हैं, Aतो अंततः विनाशकारी कहा जाएगा। चूंकि यह शुद्ध है और इसका कार्यान्वयन नहीं है, अपरिभाषित व्यवहार सुनिश्चित करेगा। एक लोकप्रिय प्लेटफ़ॉर्म पर, जो कि प्योरकॉल हैंडलर और क्रैश को लागू करेगा।

संपादित करें: घोषणा को अधिक अनुरूप बनाने के लिए, http://www.comeaucomputing.com/tryitout/ के साथ संकलित


16
उम, हाँ यह है। शुद्ध का मतलब केवल एक व्युत्पन्न वर्ग को एक कार्यान्वयन प्रदान करना है।
एमएसएन

72
शुद्ध आभासी कार्यों को लागू करना वास्तव में कानूनी है। डिफ़ॉल्ट कार्यान्वयन प्रदान करने के लिए बहुत उपयोगी है लेकिन उपवर्गों को इसे स्पष्ट रूप से कॉल करने के लिए मजबूर करना।
jmucchiello

6
एमएसएन और ध्यान दें कि यदि आपके पास हेडर में वह परिभाषा है, तो आपको ओडीआर (एक परिभाषा नियम) का उल्लंघन करने से बचने के लिए "इनलाइन" डालने की आवश्यकता है
जोहान्स स्काउब -

2
क्यों ए :: ~ ए () को स्पष्ट रूप से परिभाषित किया जाना है, क्योंकि, मैंने सोचा कि हर वस्तु के लिए एक डिफ़ॉल्ट विध्वंसक है? किसी भी प्रकार की विरासत में, विध्वंसक की श्रृंखला को हमेशा कहा जाता है और बेस क्लास विध्वंसक को हमेशा परिभाषित नहीं करना पड़ता है।
जेफडी

11
इसे लगाने का एक बेहतर तरीका यह है कि एक बार जब आप एक विध्वंसक की घोषणा करते हैं, तो यह स्वचालित रूप से आपके लिए लागू नहीं होता है।
एमएसएन

49

निजी विध्वंसक: जब आप किसी व्युत्पन्न वर्ग की वस्तु बनाते हैं, तो वे आपको एक त्रुटि देंगे - अन्यथा नहीं। एक निदान हालांकि दिखाई दे सकता है।

12.4 विध्वंसक

6 एक विध्वंसक को आभासी (10.3) या शुद्ध आभासी (10.4) घोषित किया जा सकता है; यदि प्रोग्राम में उस वर्ग या किसी व्युत्पन्न वर्ग की कोई भी वस्तु बनाई जाती है, तो विध्वंसक को परिभाषित किया जाएगा।

शुद्ध आभासी विध्वंसक के साथ एक वर्ग एक अमूर्त वर्ग है। अच्छी तरह से ध्यान दें:

10.4 सार वर्ग

2 एक शुद्ध आभासी फ़ंक्शन को केवल तभी परिभाषित किया जाना चाहिए, जब उसे (12.4), योग्य-आईडी सिंटैक्स (5.1) के साथ कहा जाता है।

[ नोट : एक फ़ंक्शन घोषणा शुद्ध-निर्दिष्ट और परिभाषा-दोनों नोट प्रदान नहीं कर सकती]

ड्राफ्ट से सीधे लिया गया:

struct C {
   virtual void f() = 0 { }; // ill-formed
};

14
+1। मुझे लगता है कि हर्ब सटर की इस पर भी कुछ अच्छी जानकारी है: gotw.ca/gotw/031.htm । यह ध्यान रखना दिलचस्प है कि किसी भी शुद्ध आभासी फ़ंक्शन में एक कार्यान्वयन हो सकता है, न कि केवल विध्वंसक।
फ्रेड लार्सन

6
हाँ, यह कुछ ऐसा है जो आप अपने साक्षात्कारकर्ताओं को
आकर्षित

1
मेरे अनुभव में यह सब असामान्य नहीं है।

@ नील बटरवर्थ: कौन सा?
dirkgently

@Dirk - "कोई भी फ़ंक्शन" परिदृश्य। कुछ सामान्य व्यवहार को लागू करने के लिए इसका इस्तेमाल किया जाना असामान्य नहीं है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.