我听说使用虚拟关键字可以解决钻石问题。
然而,当我这样做时:
#include <iostream>
using namespace std;
class A {
public:
A(int x = 100) {
num = x;
}
protected:
int num;
};
class B1 : virtual public A{
public:
B1(int x = 50) : A(2*x) {
}
};
class B2 : virtual public A{
public:
B2(int x = 50) : A(2*x) {
}
};
class C : public B1, public B2 {
public:
C(int x = 75) : B1(2*x), B2(2*x) {};
int getData(){ return num; }
};
int main() {
C c(10);
cout << c.getData();
cin.get();
return 0;
}
它将输出显示为100而不是我预期的结果,即40.为什么?
答案 0 :(得分:2)
当您使用虚拟继承时,保证您拥有公共基类的一个实例(cite);因此,B1
和B2
不能拥有自己的A
实例,但他们会与C
共享一个实例。例如,如果您按如下方式定义C
的构造函数:
C(int x = 75) : B1(2*x), B2(2*x), A(x) {};
您会看到代码输出10
。关键在于@dyp评论的内容:
公共基类在最派生类
中初始化
(当然,在上面的示例中,将初始化列表中的所有B1
,B2
和A
都设置为{{1}是没有任何意义的。就足够了。)