对于虚拟基类的个人理解,如有误恳请指正。
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。