C++

2009-03-10 19 views
136

शुद्ध आभासी नाशक यह लिखने के लिए गलत है?C++

कम से कम यह एमएसवीसी में संकलित है ... क्या यह रन टाइम पर दुर्घटनाग्रस्त हो जाएगा?

+7

यह संकलन सकता है, लेकिन क्या यह लिंक करता है? –

उत्तर

182

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

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

inline A::~A() { } 

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

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

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

+0

तो इसे "= 0" के बिना वर्चुअल ~ ए() {} घोषित किया जाना चाहिए। यदि आप कार्यान्वयन प्रदान करते हैं तो यह शुद्ध वर्चुअल नहीं है – jalf

+15

उम, हाँ यह है। शुद्ध केवल मतलब है कि व्युत्पन्न वर्ग को भी कार्यान्वयन प्रदान करने की आवश्यकता है। – MSN

+65

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

45

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

12,4 Destructors

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

शुद्ध वर्चुअल विनाशक वाला एक वर्ग एक सार वर्ग है। अच्छी तरह से नोट:

10,4 सार कक्षाएं

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

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

मसौदे से सीधे लिया गया:,

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

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

+6

हां, यह आपके साक्षात्कारकर्ताओं को फिक्र करने के लिए एक साक्षात्कार में कुछ है;) – dirkgently

+1

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