规则:如果父类中有虚基类(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)

本文通过C++代码示例介绍了当子类继承自一个包含虚基类的父类时,构造函数如何调用虚基类的构造过程。特别强调了在子类构造函数初始化列表中未明确调用虚基类带参数构造函数的情况下,默认构造函数会被调用。
977

被折叠的 条评论
为什么被折叠?



