c++ - कंस्ट्रक्टर विरासत




inheritance gcc (4)

यह कोड क्यों है:

class A
{
    public: 
        explicit A(int x) {}
};

class B: public A
{
};

int main(void)
{
    B *b = new B(5);
    delete b;
}

इन त्रुटियों में परिणाम:

main.cpp: In function ‘int main()’:
main.cpp:13: error: no matching function for call to ‘B::B(int)’
main.cpp:8: note: candidates are: B::B()
main.cpp:8: note:                 B::B(const B&)

बी को ए के निर्माता का उत्तराधिकारी नहीं होना चाहिए?

(यह जीसीसी का उपयोग कर रहा है)


आपको बी में कन्स्ट्रक्टर को स्पष्ट रूप से परिभाषित करना होगा और स्पष्ट रूप से माता-पिता के लिए कन्स्ट्रक्टर को कॉल करना होगा।

B(int x) : A(x) { }

या

B() : A(5) { }

यह सीधे बजेर्न स्ट्राउस्ट्रप के पृष्ठ से है :

यदि आप ऐसा चुनते हैं, तो आप अभी भी एक व्युत्पन्न कक्षा में रचनाकारों को विरासत में प्राप्त करके पैर में खुद को गोली मार सकते हैं जिसमें आप प्रारंभिकता की आवश्यकता वाले नए सदस्य चर को परिभाषित करते हैं:

struct B1 {
    B1(int) { }
};

struct D1 : B1 {
    using B1::B1; // implicitly declares D1(int)
    int x;
};

void test()
{
    D1 d(6);    // Oops: d.x is not initialized
    D1 e;       // error: D1 has no default constructor
}

सभी रचनाकारों को बांधने के लिए टेम्पलेट फ़ंक्शन का उपयोग करने के बारे में कैसे?

template <class... T> Derived(T... t) : Base(t...) {}

सही कोड है

class A
{
    public: 
      explicit A(int x) {}
};

class B: public A
{
      public:

     B(int a):A(a){
          }
};

main()
{
    B *b = new B(5);
     delete b;
}

त्रुटि बी / सी क्लास बी में पैरामीटर कन्स्ट्रक्टर नहीं है और दूसरा बेस बेस पैरामीटर कन्स्ट्रक्टर के कन्स्ट्रक्टर को कॉल करने के लिए बेस क्लास प्रारंभकर्ता होना चाहिए







constructor