2013-01-23 11 views
5

संभव डुप्लिकेट:
Default constructor and virtual inheritanceआभासी विरासत और parametrized कंस्ट्रक्टर्स

class Base 
{ 
private: 
    int number; 
protected: 
    Base(int n) : number(n) {} 
public: 
    virtual void write() {cout << number;}  
}; 

class Derived1 : virtual public Base 
{ 
private: 
    int number; 
protected: 
    Derived1(int n, int n2) : Base(n), number(n2) {} 
public: 
    virtual void write() {Base::write(); cout << number;} 
}; 

class Derived2 : virtual public Base 
{ 
private: 
    int number; 
protected: 
    Derived2(int n, int n2) : Base(n), number(n2) {} 
public: 
    virtual void write() {Base::write(); cout << number;} 
}; 

class Problematic : public Derived1, public Derived2 
{ 
private: 
    int number; 
public: 
    Problematic(int n, int n2, int n3, int n4) : Derived1(n, n2), Derived2(n, n3), number(n4) {} 
    virtual void write() {Derived1::write(); Derived2::write(); cout << number;} 
}; 

int main() 
{ 
    Base* obj = new Problematic(1, 2, 3, 4); 
    obj->write(); 
} 

दूसरे शब्दों में:

Base 
| \ 
| \ 
| \ 
| \ 
D1 D2 
| /
| /
|/
|/
Problematic 

मैं "पाने के लिए 1 2 1 कोशिश कर रहा हूँ आउटपुट पर 3 4 "। हालांकि, संकलक शिकायत करता रहता है कि मुझे बेस में पैरामीटर रहित कन्स्ट्रक्टर की आवश्यकता है, लेकिन जब मैं एक जोड़ता हूं, तो "1" कचरा में बदल जाता है। इस पर कैसे पहुंचे इस पर कोई विचार? क्या एक parametrized कन्स्ट्रक्टर का उपयोग कर हीरा पैटर्न को हल करना भी संभव है?

+1

आप भूल रहे हैं, 'व्युत्पन्न वर्ग पर रों – cppguy

+0

@cppguy - मैं इसे नहीं दिख रहा है, लेकिन यह वास्तविक कोड वैसे भी (शायद सिर्फ एक टाइपो) नहीं है। –

+0

@MaciejStachowski ildjarn ने इसे आपके लिए जोड़ा –

उत्तर

2

Calling a virtual base class's overloaded constructor पर एक नज़र डालें, ऐसा लगता है कि विरासत वर्चुअल है, सबसे व्युत्पन्न कक्षा को बेस क्लास कन्स्ट्रक्टर को कॉल करना होगा।

Problematic(int n, int n2, int n3, int n4) : Derived1(n, n2), Derived2(n, n3), Base(n), number(n4) {} 
+0

तो, इसका मतलब है कि Derived1/2 या उनके किसी भी उप-वर्ग से विरासत में प्राप्त सभी वर्गों को बेस कन्स्ट्रक्टर को कॉल करना होगा? सी ++ के लिए मेरा प्यार थोड़ा सा छोटा हो गया है। –

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