假设我们有一个菱形继承其中D从B1和B2,其底部为V如下继承:C++虚拟菱形继承
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);
在此先感谢。
简而言之:虚基类是由大多数派生类的构造函数初始化的。 – Angew
这正是虚拟继承的用途。如果您确实需要两个不同的'V'子对象,请不要使用虚拟继承。 – aschepler