2010-11-01 16 views
5

मेरा प्रश्न शायद एक उदाहरण द्वारा सबसे अच्छा समझाया जाएगा।बेस क्लास से ओवरराइड फ़ंक्शन को कॉल करना?

उदाहरण के लिए, मैं 2 श्रेणियां होती हैं: एक आधार वर्ग और एक व्युत्पन्न वर्ग:

class baseClass 
{ 
public: 
    baseClass() 
    { 
     foo(); 
    } 
    virtual bool foo() { printf("baseClass"); return false;} 

}; 

class derivedClass : public baseClass 
{ 
public: 
    bool foo() 
    { 
     printf("derivedClass"); 
     return true; 
    } 

}; 

जब मैं derivedClass का एक उदाहरण बनाने के लिए, baseClass में निर्माता के नाम से जाना जाएगा, और यह है से foo() बुलाया जाएगा निर्माता। समस्या यह है कि बेसक्लास 'कन्स्ट्रक्टर अपने foo() पर कॉल कर रहा है और व्युत्पन्न क्लास ओवरराइड किए गए foo() पर ओवरराइड नहीं किया गया है। क्या बेस क्लास ओवरराइड फ़ंक्शन को कॉल करने के लिए वैसे भी है, न कि यह फ़ंक्शन की अपनी परिभाषा है?

उत्तर

17

आपको किसी कन्स्ट्रक्टर से वर्चुअल विधि नहीं कॉल करना चाहिए क्योंकि ऑब्जेक्ट अभी तक पूरी तरह से निर्मित नहीं हुआ है। अनिवार्य रूप से, व्युत्पन्न वर्ग अभी तक मौजूद नहीं है, इसलिए इसकी विधियों को नहीं बुलाया जा सकता है।

+0

+1: रचनाकार विशेष और tricksy हैं;) – James

+0

उत्तर के लिए धन्यवाद! मैं अब बेवकूफ की तरह महसूस करता हूं क्योंकि मुझे पहले से ही यह पता होना चाहिए था। धन्यवाद:] – Brad

+2

कुछ ऐसा करने के तरीकों के लिए, सी ++ एफएक्यू लाइट 23.6 देखें: http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.6 – aschepler

0

अधिकांश भाषाओं में, यह व्यवहार या तो निषिद्ध या अनिर्धारित है, अच्छे कारण के साथ।

इस पर विचार करें: बेस क्लास कन्स्ट्रक्टर उपclass कन्स्ट्रक्टर से पहले चलाया जाता है, इसलिए सुब्लास द्वारा परिभाषित कोई भी वर्ण अनियमित हो जाएगा। क्या आप वाकई उन परिस्थितियों में उप-वर्गीकृत विधि को कॉल करना चाहते हैं?

सबसे सरल विकल्प अपने सुपरक्लास में प्रारंभिक() विधि को परिभाषित करना है, फिर बस अपने उप-वर्ग निर्माता से प्रारंभ() को कॉल करना याद रखें।

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