2014-04-09 4 views
5

मैंने अपने प्रश्नों के उत्तर के लिए इंटरनेट पर देखा लेकिन कोई भी नहीं मिला, इसलिए मैं यहां हूं।शुद्ध आभासी और ओवरराइड फ़ंक्शन (सी ++)

class baseClass 
{ 
    public: 
     virtual void myFunction() = 0; 
} 

class derivedClass : public baseClass 
{ 
    public: 
     virtual void myFunction() override; 
} 

यह सही है:

मेरी समारोह है कि एक शुद्ध आभासी से प्राप्त होने वाले ओवरराइड निर्दिष्ट करने के लिए यह सही है?

और मेरा दूसरा प्रश्न है: क्या मुझे अपने कार्य के लिए व्युत्पन्न क्लास में वर्चुअल निर्दिष्ट करना है, भले ही कोई भी वर्ग मेरी व्युत्पन्न कक्षा से विरासत में नहीं मिलेगा (यह अंतिम होगा)?

आपके उत्तरों के लिए बहुत बहुत धन्यवाद!

उत्तर

3

क्या यह सही है?

Yes. ओवरराइड यह सुनिश्चित करता है कि फ़ंक्शन वर्चुअल और बेस क्लास से वर्चुअल फ़ंक्शन ओवरराइड कर रहा है। कार्यक्रम खराब नहीं है (एक संकलन-समय त्रुटि उत्पन्न होती है) यदि यह सत्य नहीं है।

क्या मुझे अपने कार्य के लिए व्युत्पन्न क्लास में वर्चुअल निर्दिष्ट करना है, भले ही कोई भी वर्ग मेरी व्युत्पन्न कक्षा से विरासत में नहीं मिलेगा (यह अंतिम होगा)?

नहीं, आप नहीं करते हैं। लेकिन अगर आप आभासी विनिर्देशक को छोड़ देते हैं तो यह वर्चुअल बना रहता है। क्योंकि इसे आपके BaseClass में वर्चुअल घोषित किया गया है।

कुछ सदस्य समारोह VF एक वर्ग बेस में आभासी के रूप में घोषित किया गया है, और कुछ वर्ग व्युत्पन्न है, जो प्राप्त होता है, प्रत्यक्ष या परोक्ष रूप बेस से, एक ही

साथ सदस्य समारोह के लिए एक घोषणा है
  • नाम
  • पैरामीटर प्रकार सूची (लेकिन वापसी प्रकार)
  • सीवी-क्वालिफायर
  • रेफरी-क्वालिफायर

फिर कक्षा व्युत्पन्न में इस समारोह भी आभासी है (कीवर्ड आभासी नहीं इसकी घोषणा में प्रयोग किया जाता है कि क्या है या ) और बेस :: VF ओवरराइड करता है (या नहीं, शब्द ओवरराइड अपने घोषणा में प्रयोग किया जाता है) । आधार :: vf को दृश्यमान होने की आवश्यकता नहीं है (ओवरराइड होने के लिए निजी, या निजी विरासत का उपयोग करके विरासत में घोषित किया जा सकता है)।

+0

ठीक है, शेयर के लिए धन्यवाद। एक और सवाल: जब मैं derivedClass में ओवरराइड निर्दिष्ट नहीं करता हूं तो संकलक शिकायत क्यों नहीं कर रहा है? – Silouane

+1

ओवरराइड विनिर्देशक सी ++ 11 में पेश किया गया है। यह आपको गलती से नए कार्यों को जोड़ने से रोकता है जो आपको लगता है कि ओवरराइड हैं।उदाहरण के लिए यदि आप गलती से अपने DerivedClass में रिटर्न प्रकार बदलते हैं तो संकलक ओवरराइड विनिर्देशक का उपयोग करते हुए एक त्रुटि के साथ आ जाएगा। यदि आप ओवरराइड विनिर्देशक का उपयोग नहीं कर रहे हैं तो आप एक नई वर्चुअल विधि घोषित कर देंगे। – Sambuca

+1

समझ गया, धन्यवाद। – Silouane

1

इसके अलावा, कृपया याद रखें कि आप एक आभासी नाशक परिभाषित करना चाहिए baseClass में (खाली एक हो सकता है), आदेश व्युत्पन्न वर्ग में एक उचित संसाधन आवंटन रद्द करने की गारंटी के लिए।

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