对于虚拟基类的个人理解,如有误恳请指正。
1.不用虚拟基类
class cBase_A
{
int x;
public:
cBase_A( ){x=10;}
int getx(){return x;}
void setx(int a){x=a;}
};
class cBase_B: public cBase_A
{
};
class cBase_C: public cBase_A
{
};
class cDerived_D: public cBase_B, public cBase_C
{
};
int main( int argc, char* argv[])
{
cDerived_D x;
int y,z,s;
y=x.cBase_B::getx( );
x.cBase_C::setx(11);
y=x.cBase_B::getx( );
z=x.cBase_C::getx( );
s=x.cBase_B::getx( );
cout <<"y="<<y<<"\n";
cout <<"z="<<z<<"\n";
cout <<"s="<<s<<"\n";
}
运行结果
上述代码中,cDrived_D是cBase_B和cBase_C的基类,而cBase_B和cBase_C又是cBase_A的基类。
可见在调用B和C的时候都单独构造了各自的基类A。
2.使用虚拟基类
class cBase_B: virtual public cBase_A
{
};
class cBase_C: virtual public cBase_A
{
};
运行结果
修改了B,C的值也改变了。可见在调用B和C的时候,B和C共用一个基类A。