2013-06-26 6 views
6

इस कोड में:क्या वर्चुअल फ़ंक्शन गैर-वर्चुअल फ़ंक्शन द्वारा ओवरराइड किया जा सकता है?

class Base { 
public: 
    virtual void method() = 0; 
}; 

class Derived1 : public Base{ 
public: 
    virtual void method() override { } 
}; 

class Derived2 : public Base{ 
public: 
    void method() override { } 
}; 

वहाँ Derived1 और Derived2 के बीच कोई अंतर है?

+3

'Derived2 :: method2' वर्चुअल है। –

+0

अगर वाक्यविन्यास इसे अनुमति देता है। (चेक नहीं किया गया) तो 'derived2-> विधि() 'वर्चुअल भी होगा (हालांकि हालांकि) – Alex

+0

@ आर। मार्टिन्होफर्नैंड्स: तो वर्चुअल कीवर्ड का अर्थ है? – Eric

उत्तर

16

अनुभाग से 10.3 आभासी कार्यों 11 मानक (मसौदा n3337) बिंदु सी के ++ 2:

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

तो Derived2::method भी virtual हालांकि यह स्पष्ट रूप से इस तरह के रूप में घोषित किया नहीं है,।

+0

के तहत मेरे लिए वर्चुअल कीवर्ड के बिना सदस्य घोषित करना कभी भी वांछनीय है? क्या ऐसा होने पर चेतावनी थूकने के लिए जीसीसी बनाया जा सकता है? – Eric

+0

@Eric: कुछ तर्क देते हैं कि व्युत्पन्न फ़ंक्शन वर्चुअल को चिह्नित करने से दस्तावेज़ों के रूप में कार्य किया जाता है, अन्य लोग तर्क देते हैं कि यह अनावश्यक कोड ब्लोट है। व्यवहार में यह वास्तव में किसी भी तरह से कोई फर्क नहीं पड़ता। –

+4

सी ++ 11 के साथ ओवरराइड कीवर्ड का उपयोग यह इंगित करने के लिए कर सकता है कि व्युत्पन्न वर्ग में कोई फ़ंक्शन आभासी है। –

4

वे समान हैं।

virtual वास्तव में एक फ़ंक्शन ओवरराइड करते समय वैकल्पिक है। बेस क्लास में फ़ंक्शन को चिह्नित करते समय केवल अनिवार्य है।

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