使用Virtual关键字在多重继承中进行钻石继承

时间:2015-04-21 20:34:22

标签: c++

我听说使用虚拟关键字可以解决钻石问题。

然而,当我这样做时:

#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.为什么?

1 个答案:

答案 0 :(得分:2)

当您使用虚拟继承时,保证您拥有公共基类的一个实例cite);因此,B1B2不能拥有自己的A实例,但他们会与C共享一个实例。例如,如果您按如下方式定义C的构造函数:

C(int x = 75) : B1(2*x), B2(2*x), A(x) {};

您会看到代码输出10。关键在于@dyp评论的内容:

  

公共基类在最派生类

中初始化

(当然,在上面的示例中,将初始化列表中的所有B1B2A都设置为{{1}是没有任何意义的。就足够了。)