承中,这里B就是C1和C2的虚基类,而C1和C2就是带有虚基类的类
class B
{
public:
int _b;
};
class C1:virtual public B
{
public:
int _c1;
};
class C2:virtual public B
{
public:
int _c2;
};
class D:public C1, public C2
{
public:
int _d;
};
void FunTest(C1* ptr) //重点观察我们的这个函数
{
ptr->_b = 10;
}
int main()
{
D* d = new D();
C1* c = new C1();
FunTest(d);
FunTest(c);
return 0;
}
我们可以看到FunTest函数形参是C1类型的指针,但是实参是不同的,但是我们运行之后发行,可以编译通过,说明这里和形参的类型无关,因为这里是一个带有虚基类的类,因此编译器认为是被需要的,因此会自动合成一个默认构造函数,并且有一个虚拟指针指向一张虚函数表,指向B类的构造函数,最后两个实参都指向了同一个地址,就可以找到_b 在编译器是否会自己合成默认构造函数这个问题上,并不是我所想的那么简单,如果发现错误,希望被指正!
|