#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;
}
上面的代碼是鑽石類的繼承圖。基類是A.我使用虛擬繼承來避免鑽石問題。但爲什麼這個程序的輸出是,0,0,而不是1,2正如我所料?
B
的構造函數通過data=1
,並且在其初始化程序列表中它調用A
和data
。 C
的構造函數類似於data=2
及其初始化列表,它調用A
與data
。
然後我們要求B
和C
子對象show
它們的值。我們得到0
0
不是1
2
正如我所料。
你可以非常容易地擁有1,2個 - 只是讓這個繼承不是虛擬的:)然後你將擁有兩個A的拷貝 –
無論如何'this->'很奇怪。在現代C++中,你可以編寫'A(int data = 0):data(data){','構造函數初始化列表',它更乾淨,並且允許你擁有常量成員。 –
這不是問題,但是你真的需要額外的東西,'std :: endl'嗎? ''\ n''結束一行。 –