पर विचार करें:यह हीरा वर्ग विरासत आउटपुट क्यों नहीं है जो मैं उम्मीद करता हूं?
#include <iostream>
using namespace std;
class A {// base class
private:
int data;
public:
A(int data = 0)
{
this->data = data;
}
void show()
{
cout << data << endl;
return;
}
};
class B : virtual public A {
public:
B(int data = 0) :
A(data) {
}
};
class C : virtual public A {
public:
C(int data = 0) :
A(data) {
}
};
class D : public B, public C {
public:
D(int dataB = 0, int dataC = 0) :
B(dataB),
C(dataC) {
}
};
int main() {
D d(1, 2);
d.B::show();
d.C::show();
return 0;
}
ऊपर कोड हीरा वर्ग विरासत आरेख है। बेस क्लास ए है। मैं हीरे की समस्या से बचने के लिए वर्चुअल विरासत का उपयोग करता हूं। लेकिन इस कार्यक्रम का आउटपुट 0,0 क्यों नहीं है, 1,2 जैसा कि मुझे उम्मीद है?
B
का निर्माता data=1
पारित किया गया है, और इसकी प्रारंभिक सूची में यह के साथ A
पर कॉल करता है। C
का कन्स्ट्रक्टर इसी प्रकार data=2
पास हो गया है और इसकी प्रारंभिक सूची में A
data
के साथ कॉल किया गया है।
हम B
और C
subobjects show
पर उनके मूल्य पूछते हैं। और हमें 0
0
1
2
जैसा कि मैं उम्मीद करता हूं।
आप 1,2 बहुत आसानी से समायोजित कर सकते हैं-समायोजन उस विरासत को वर्चुअल नहीं बनाते हैं :) फिर आपके पास ए –
की दो प्रतियां होंगी, वैसे भी 'यह->' अजीब है। आधुनिक सी ++ में आप 'ए (int डेटा = 0) लिख सकते हैं: डेटा (डेटा) {} ',' कन्स्ट्रक्टर प्रारंभिक सूची ', जो क्लीनर है, और आपको निरंतर सदस्यों की अनुमति देता है। –
यह समस्या नहीं है, लेकिन क्या आपको वास्तव में अतिरिक्त सामग्री की आवश्यकता है जो 'std :: endl' करता है? '\ n '' एक रेखा समाप्त होता है। –