2010-06-19 19 views
5
class Base { 
    public: 
    Base() {} 

    void Foo(int x) {...} 
}; 

class Derived : public Base { 
    public: 
    Derived(int args) { 
     /* process args in some way */ 

     Foo(result); 
    } 
}; 

क्या इसे व्युत्पन्न कक्षा के निर्माता में बेस क्लास की विधि कॉल करने की अनुमति है? मुझे लगता है कि यह ठीक है क्योंकि बेस ऑब्जेक्ट पूरी तरह से बनाया जाना चाहिए, लेकिन मैं सिर्फ मामले में जांचना चाहता था।व्युत्पन्न कन्स्ट्रक्टर से बेस क्लास विधि को कॉल करना

उत्तर

11

क्या इसे व्युत्पन्न कक्षा के निर्माता में बेस क्लास की विधि कॉल करने की अनुमति है?

हां। बस virtual कार्यों के लिए बाहर देखो। यदि Derived से प्राप्त एक वर्ग वर्चुअल फ़ंक्शन को ओवरराइड करता है, तो उस आगे व्युत्पन्न कक्षा के उप-ऑब्जेक्ट के रूप में Derived का निर्माण करते समय, गतिशील प्रकार हमेशा Derived होता है, इसलिए आगे व्युत्पन्न कक्षाओं में ओवरराइड किए गए वर्चुअल फ़ंक्शन को नहीं कहा जाता है। (यह विनाशक, बीटीडब्ल्यू के लिए भी जाता है।)

मुझे लगता है कि यह ठीक है क्योंकि मूल वस्तु पूरी तरह से बनाई जानी चाहिए, लेकिन मैं बस मामले में जांचना चाहता था।

आपकी तर्क सही है।

1

वहाँ एक खतरा जब है:
1. विधि ओवरराइड की गई है
2. विधि अन्य तरीकों कि

+2

अधिरोहित कर रहे हैं यही कारण है कि सादा गलत है कहते हैं। अधिभारित कार्यों और रचनाकारों के साथ निश्चित रूप से कोई समस्या नहीं है। क्या आपका मतलब _overridden_ ​​है? (और यदि ऐसा है, तो यह न भूलें कि यह केवल वर्चुअल फ़ंक्शंस पर लागू होता है।) – sbi

+0

अपवॉट (और एसबीआई का जवाब भी), लेकिन आप 'ओवरराइड' का मतलब है, 'ओवरलोडेड' – tpdi

+0

एसबीआई, adf88 की रक्षा में, ओवरराइड वर्चुअल (जैसा कि अन्यथा यह छुपा हुआ है, ओवरराइड नहीं है, और शायद एक गलती है)। – tpdi

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