2013-10-01 177 views
1

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

在此先感谢。

+0

简而言之:虚基类是由大多数派生类的构造函数初始化的。 – Angew

+0

这正是虚拟继承的用途。如果您确实需要两个不同的'V'子对象,请不要使用虚拟继承。 – aschepler

回答

1

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

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

+0

是否有权说在继承中,派生类负责构造所有的基类? –

+3

@HeshamYassin编号最派生的类负责构建所有虚拟基类及其直接基础。 –

0

基类V被调用一次因为V1V2从五inhert virtualy如果你还没有到virtualy inhert问题将occure的可能性:例如,如果我调用基类的方法源于一个编译器无法知道哪个基类呼叫,从V1构造的那个或从V2构造的那个。

所以虚拟继承给了我们在没有这个问题的情况下拥有钻石不合理的可能性。