2010-08-17 17 views
14

मुझे लगता है कि वर्चुअल अकेले आम तौर पर पर्याप्त है।क्या एक अमूर्त वर्ग 'विनाशक शुद्ध आभासी होना चाहिए?

क्या व्युत्पन्न कक्षाओं को अपने स्वयं के विनाशक को लागू करने के लिए इसे शुद्ध वर्चुअल बनाने के लिए एक और कारण है? मेरा मतलब है कि अगर आप अपनी कक्षा के निर्माता में कुछ आवंटित करते हैं तो आपको अपना खुद का विनाशक बनाना चाहिए - अगर आपकी कक्षा व्युत्पन्न हो या नहीं।

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

कुछ और उपयोग करता है?

+4

ध्यान दें कि संकलक स्वचालित रूप से व्युत्पन्न वर्ग में विनाशक उत्पन्न करता है यदि कोई स्पष्ट रूप से प्रदान नहीं किया गया हो। यह स्वचालित रूप से उत्पन्न विनाशक पर्याप्त है, आपको खुद को एक विनाशक लिखने के लिए मजबूर नहीं किया जाता है, भले ही बेस क्लास में से एक शुद्ध है। – sth

+0

तो पहले कारण भी वास्तव में कोई नहीं है। महान टिप्पणी! –

+0

बस एक साइड नोट: वर्चुअल होना चाहिए (दूसरा होने पर) ऑपरेटर =। Dtor के समान कारण। – rkellerm

उत्तर

10

आप अपने वर्ग सार चाहते हैं और यह कोई शुद्ध आभासी कार्य करता है तो - यह नाशक के लिए छोड़ दें।

वास्तव में, मुझे नहीं लगता कि और भी कुछ है। सभी शुद्ध आभासी विनाशक, पूरे वर्ग सार बनाते हैं। आपको शुद्ध आभासी विनाशक के साथ-साथ गैर-शुद्ध वर्चुअल विनाशक के लिए कार्यान्वयन प्रदान करना है, व्युत्पन्न कक्षाओं के विनाशक आभासी विनाशक के साथ वर्चुअल हैं, आदि

असल में, यदि किसी वर्ग में पहले से ही कुछ शुद्ध है आभासी कार्यों, इसका व्यवहार आभासी और शुद्ध आभासी विनाशक के बराबर होगा।

+0

+1। –

+0

यह वास्तव में उत्तर है, जो मेरे प्रश्न से सबसे अच्छा मेल खाता है। –

11

नहीं। यदि बेस क्लास कुछ भी आवंटित करता है, तो इसे रिलीज़ करने की जिम्मेदारी है।

आगे, यदि व्युत्पन्न वर्ग कुछ भी नहीं बताता है, तो उन्हें डमी डोर लिखने के लिए मजबूर करने में कोई बात नहीं है।

+2

आप उन्हें किसी भी चीज़ पर मजबूर नहीं करते हैं। अगर वे विनाशक को परिभाषित नहीं करते हैं, तो संकलक उनके लिए ऐसा करेगा। –

+0

@Tadeusz: भले ही यह आधार में शुद्ध वर्चुअल है? –

+1

हां - जीसीसी 3.4.5 के साथ परीक्षण किया गया। प्रश्न: क्या वह सी ++ मानक अनुरूप है? –

-2

यदि आपकी अमूर्त कक्षा एक शुद्ध इंटरफ़ेस है, तो डेटा डेटा सदस्यों के साथ आप डीटीआर शुद्ध वर्चुअल बनाने के साथ मिल सकते हैं। मैं खुद को पसंद करता हूं, क्योंकि मैंने देखा है कि बहुत सारे हॉट-शॉट प्रोग्रामर आभासी विनाशक को भूलना भूल जाते हैं: यहां तक ​​कि जब वे वर्चुअल विधियों वाले व्युत्पन्न कक्षाएं लिखते हैं। तो मैं सड़क के नीचे रखरखाव सिरदर्द को कम करने के लिए इसे पूरी तरह से करूँगा।

+2

विनाशकों को लिखने के लिए भूलना किसी वर्ग में जोखिम नहीं है, न केवल कक्षाएं प्राप्त की गई हैं! यहां सबसे बड़ी समस्या भूल रही है * बेस * कक्षा में वर्चुअल विनाशक लिखने के लिए। –

+0

मुझे यकीन नहीं है कि डाउन वोट क्यों था? क्योंकि इस बारे में कोई टिप्पणी नहीं थी। इसलिए यह बहुत उपयोगी नहीं है - अगर मुझे कुछ याद आ रहा है या अगर मैंने खुद को बहुत अच्छी तरह से स्पष्ट नहीं किया (जो मुझे लगता है कि मैं आज सुबह एक सबूत-पाठक का उपयोग कर सकता था) –

1

आदर्श रूप से भाषा को आश्वस्त करने का एक तरीका होना चाहिए (निस्संदेह या नहीं) कि विनाशक इसे परिभाषित किए बिना या इसे शुद्ध करने के बिना अमूर्त कक्षाओं में आभासी है। लेकिन यह नहीं है।

तो विकल्प यह है: या तो इसे शुद्ध करें, और प्रत्येक व्युत्पन्न वर्ग में इसे परिभाषित करने का बोझ लें, या इसे न बनाएं, और इसे अमूर्त वर्ग में परिभाषित करने का बोझ लें। बाद में कम काम है, और छोटा कोड भी है, इसलिए मैं इसके लिए जाऊंगा।

+0

छोटा कोड क्योंकि शुद्ध वर्चुअल डॉटर को कक्षा के बाहर लागू किया जाना चाहिए। शुद्ध आभासी के खिलाफ पहला तर्क! धन्यवाद –

+1

असल में, मुझे कोई बात नहीं है कि कोड कम हो जाएगा। 'Klass() = 0' + इसकी कार्यान्वयन और' ~ Klass() {} ' – jpalecek

+1

" + इसका कार्यान्वयन "बिंदु है क्योंकि यह इनलाइन नहीं हो सकता है, यानी Klass :: ~ Klass() {} –