#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''结束一行。 –