2012-11-19 32 views
5

अगर मैं एक आधार वर्ग है:व्युत्पन्न वर्ग निर्माता कॉल

class Base{ 
    ... 
}; 

और एक व्युत्पन्न वर्ग

class Derived : public Base{ 
    ... 
} 

इस व्युत्पन्न वर्ग हमेशा आधार वर्ग के डिफ़ॉल्ट निर्माता फोन करता है? यानी कन्स्ट्रक्टर जो कोई पैरामीटर नहीं लेता है? उदाहरण के लिए अगर मैं आधार वर्ग के लिए एक निर्माता को परिभाषित:

Base(int newValue); 

लेकिन मैं डिफ़ॉल्ट निर्माता परिभाषित नहीं करते (parameterless निर्माता):

Base(); 

(मैं पहचान यह केवल एक घोषणा है और नहीं एक परिभाषा) मुझे एक त्रुटि मिलती है, जब तक कि मैं डिफ़ॉल्ट कन्स्ट्रक्टर को परिभाषित नहीं करता जो कोई पैरामीटर नहीं लेता है। क्या ऐसा इसलिए है क्योंकि आधार वर्ग का डिफ़ॉल्ट कन्स्ट्रक्टर वह है जिसे व्युत्पन्न वर्ग द्वारा बुलाया जाता है?

+0

आप बेस क्लास प्रिंट में डिफॉल्ट कन्स्ट्रक्टर बनाकर स्क्रीन के लिए अद्वितीय कुछ बनाकर देख सकते हैं। इस तरह की चीजों की जांच करने के लिए यह एक अच्छा तरीका है और आप चीजों को सीखना चाहते हैं! –

उत्तर

9

हां, डिफ़ॉल्ट रूप से, डिफ़ॉल्ट कन्स्ट्रक्टर कहा जाता है। आप इस के आसपास स्पष्ट रूप से एक गैर-डिफ़ॉल्ट निर्माता को फोन करके जा सकते हैं:

class Derived : public Base{ 
    Derived() : Base(5) {} 
}; 

इस आधार निर्माता है कि एक पैरामीटर लेता कॉल करेंगे और तुम अब आधार वर्ग में डिफ़ॉल्ट निर्माता घोषित करने के लिए है।

1

डिफ़ॉल्ट कन्स्ट्रक्टर कहलाता है इसका कारण यह है कि यदि आपने कोई ऑब्जेक्ट बनाया है और उस उदाहरण पर आपने तर्क पारित नहीं किए हैं (आप बाद में प्रोग्राम में उन्हें प्रारंभ करना चाहते हैं)। यह सबसे सामान्य मामला है, यही कारण है कि डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल करना जरूरी है। मामले में (parameterless) ctor

  • कॉपी ctor

  • असाइनमेंट ऑपरेटर

    1. डिफ़ॉल्ट यदि आप अपने आप को प्रदान करते हैं:

    1

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

    जब हम एक व्युत्पन्न क्लास ऑब्जेक्ट बनाते हैं तो डिफ़ॉल्ट रूप से बेस के डिफ़ॉल्ट सीटीआर के लिए खोज करते हैं और यदि हमने इसे प्रदान नहीं किया है तो संकलक त्रुटि फेंकता है। हालांकि हम अपने निर्दिष्ट बेस सीटीआर को कॉल करने के लिए व्युत्पन्न वर्ग सीटीआर बना सकते हैं।

    class Base { 
    public: 
    Base(int x){} 
    }; 
    
    class Derived { 
    public: 
    Derived():Base(5){}    //this will call Parameterized Base Ctor 
    Derived(int x):Base(x){}  //this will call Parameterized Base Ctor 
    } 
    
    0

    हां, डिफ़ॉल्ट रूप से, डिफ़ॉल्ट कन्स्ट्रक्टर कहा जाता है। लेकिन मामले में अपने आधार वर्ग तो निर्माता paramterized है आप दो तरह .:

    option 1: by explicitly calling a non-default constructor: 
    
    class Derived : public Base{ 
    Derived() : Base(5) {} 
    }; 
    

    विकल्प 2 में गैर डिफ़ॉल्ट निर्माता कॉल कर सकते हैं:

    in base class constructor set the parameter default value to 0, so it will 
    act as default as well as paramterized constructor both 
    
    for example: 
    
    class base 
    { public: 
    base(int m_a =0){} 
    }; 
    
    class Derived 
    { public: 
    Derived(){} 
    }; 
    
    दृष्टिकोण से ऊपर

    दोनों paramterized निर्माता बुला और डिफ़ॉल्ट के लिए ठीक से काम करेंगे कन्स्ट्रक्टर कॉलिंग

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