2011-04-10 18 views
9

मुझे एक परिदृश्य मिला है जहां मैं अमूर्त आधार वर्गों की कई परतों के साथ कुछ हद ऑब्जेक्ट उन्मुख कोड लिख रहा हूं, और मुझे आश्चर्य है कि मुझे स्पष्ट रूप से प्रत्येक के लिए विनाशक घोषित करना है या नहीं।आभासी विनाशकों के साथ, क्या मुझे प्रत्येक सबक्लास के लिए स्पष्ट रूप से आभासी विनाशक घोषित करने की आवश्यकता है?

क्या संकलक एक डिफ़ॉल्ट व्यक्ति उत्पन्न करेगा जो पहले से ही वर्चुअल है, या मुझे इसे बताना होगा?

+0

मुझे लगता है कि, नीचे एक टिप्पणी में, आप यह भी पूछते हैं कि आपको प्रत्येक उप-वर्ग के लिए एक विनाशक _define_ की आवश्यकता है या नहीं। और वह जवाब नहीं है। –

उत्तर

9

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

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

+2

आप शायद विनाशक, कन्स्ट्रक्टर नहीं था। – GManNickG

+0

ठीक है, धन्यवाद, इसे ठीक किया गया। – trenki

+1

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

2

सामान्य रूप से यदि कुछ फ़ंक्शन को बेस क्लास में आभासी घोषित किया जाता है, तो इसे स्पष्ट रूप से उप-वर्गों में वर्चुअल घोषित करने की आवश्यकता नहीं होती है। हालांकि यह अच्छी प्रथा है।

उप-वर्गों में विनाशकों को घोषित करने के रूप में वर्चुअल स्पष्ट रूप से आपको कोई गंभीर लाभ नहीं देता है, इसलिए यदि आप एक और वर्चुअल लिखना नहीं चाहते हैं, तो ऐसा न करें।

+0

क्या मुझे कार्यान्वयन में परिभाषा शामिल करने की आवश्यकता होगी? इसके परिणामस्वरूप मेरे कोड को अपनाने वाले खाली विनाशकों का एक बड़ा सौदा होगा। – Alex

+0

@ एलेक्स संख्या, आप इसे छोड़ सकते हैं। – UmmaGumma

3

उत्तर नहीं है। यहां एकमात्र प्रासंगिक आवश्यकता यह है कि एक vtable (i.e., कम से कम एक वर्चुअल फ़ंक्शन के साथ) में कम से कम एक आभासी विनाशक अपनी विरासत श्रृंखला में होना चाहिए। आमतौर पर इसका मतलब है कि आपकी मौलिक आधार श्रेणी एक खाली वर्चुअल विनाशक प्रदान करेगी।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^