c ++虚拟钻石继承

时间:2013-10-01 09:21:16

标签: c++ inheritance diamond-problem

让我们说我们得到了一个钻石继承,其中D从B1和B2继承,其基数为V,如下所示:

struct V { 
    V(){cout << "V()" << endl;}
    V(int){cout << "V(int)" << endl;}
}; 
struct B1 : virtual V {
    B1(){cout << "B1()" << endl;}
    B1(int i): V(i) {cout << "B1(int)" << endl;
        /*…*/ }
};
struct B2 : virtual V {
    B2(){cout << "B2()" << endl;}
    B2(int i) { cout << "B2()" << endl; }
};
struct D : B1, B2 {
    D(int i): V(i) { cout << "D(int)" << endl; }
};

当我初始化D *参数时,我希望B1和B2默认构造函数调用V构造函数。但是,当我运行下一行时,V被调用一次。为什么呢?

D* d = new D(1);

提前致谢。

2 个答案:

答案 0 :(得分:1)

虚拟基础的构造函数总是从最派生的类中调用一次;这就是它的工作原理。不止一次构建基地是没有意义的。

尝试将参数添加到基础构造函数中,看看会发生什么。

答案 1 :(得分:0)

基类V被调用一次因为来自V的V1V2 inhert,如果你没有可能出现问题,那么就会出现问题:例如,如果我从派生的方法中调用基类的方法,编译器无法知道从V1构建的基类调用或从V2构造的基类调用。

因此虚拟继承使我们有可能在没有这个问题的情况下获得钻石的无效性。

相关问题