मैं एक प्रकार पदानुक्रम में निर्माताओं के लिए नियमों बुला के साथ एक मुश्किल समय हो रही है। (निर्माता कॉल पदानुक्रम
class A{
protected:
int _i;
public:
A(){i = 0;}
A(int i) : _i(i){}
virtual ~A(){}
virtual void print(){std::cout<<i<<std::endl;}
};
class B : virtual public A{
protected:
int _j;
public:
B() : A(){_j = 0;}
B(int i, int j) : A(i), _j(j){}
virtual ~B(){}
virtual void print(){std::cout<<i<<", "<<j<<std::endl;}
};
class C : virtual public B{
protected:
int _k;
public:
C() : B(){_k = 0;}
C(int i, int j, int k} : B(i,j), _k(k){}
virtual ~C(){}
virtual void print(){std::cout<<i<<", "<<j<<", "<<k<<std::endl;}
};
int main(){
C* myC = new C(1,2,3);
myC->print();
delete myC;
return 0;
}
अब, मैं नई सी (1,2,3) बी (1,2) के निर्माता फोन जो तब बदले में निर्माता एक फोन करना चाहिए करना चाहते हैं 1: यहाँ मैं क्या कर रहा है) _i = 1, _j = 2, _k = 3 स्टोर करने के लिए। कक्षा सी के उदाहरण आईसी बनाते समय, किसी कारण से मुझे समझ में नहीं आता है, हालांकि, पहले कन्स्ट्रक्टर को कॉल करने के लिए मानक कन्स्ट्रक्टर ए, यानी ए :: ए(); यह स्पष्ट रूप से गलत परिणाम की ओर जाता है, क्योंकि संरक्षित चर _i को मान 0 असाइन किया गया है। कन्स्ट्रक्टर ए (1) कभी नहीं कहा जाता है। ऐसा क्यों है? मुझे यह बहुत काउंटर अंतर्ज्ञानी लगता है। वांछित व्यवहार प्राप्त करने के लिए टाइप-पदानुक्रम के भीतर सभी रचनाकारों को स्पष्ट रूप से कॉल करने से बचने का कोई तरीका है?
सहायता के लिए Thx!
इस तरह के उत्तरों के लिए Thx। तो, मुझे लगता है कि मैं वर्चुअल विरासत की अवधारणा को फिर से पढ़ने के लिए स्ट्रॉस्ट्रप पर वापस जाऊंगा। ऐसा लगता है कि इसे डिफ़ॉल्ट रूप से उपयोग करना बुद्धिमान नहीं है;) – user1999920
कई लोग सोचते हैं कि विरासत डिफ़ॉल्ट रूप से वर्चुअल क्यों नहीं है। खैर, आपको अपने आप से जवाब मिल गया है :) – Gorpik