规则:如果父类中有虚基类(A),且有一个直接基类(B)是虚基类的子类,那么子类(C或D)若不显式调用虚基类的有参数构造函数,它的直接基类(B)即使在构造列表中调用了非默认构造函数,那么也会直接调用虚基类的默认构造函数。
#include <iostream>
using namespace std;
const int CONST = 1;
#define CC CONST
class A{
public:
A(int){cout<<"A(int)"<<endl;}
A(){cout<<"A()"<<endl;}
};
class B: virtual public A{
public:
B(int):A(CC){cout<<"B(int)"<<endl;}
B(){cout<<"B()"<<endl;}
};
class C: public B, virtual public A{
public:
C(int):B(CC){}
};
class D: public B, virtual public A{
public:
D(int):B(CC), A(CC){}
};
int main(){
C c(CC);
D d(CC);
}
A()
B(int)
A(int)
B(int)