1

假设我们得到了一个菱形继承,其中 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);

提前致谢。

4

2 回答 2

1

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

尝试向基本构造函数添加一个参数,看看会发生什么。

于 2013-10-01T09:27:00.533 回答
0

基类V被调用一次,因为V1V2从 V 继承了 virtualy。如果您无法继承 virtualy,则会出现问题:例如,如果我从派生类调用基类的方法,编译器无法知道哪个基类调用,一个由V1或另一个由 构成V2

所以虚拟继承使我们有可能在没有这个问题的情况下拥有钻石继承权。

于 2013-10-01T12:55:09.403 回答