虚拟基类

mac2026-09-20  10

对于虚拟基类的个人理解,如有误恳请指正。

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。

图示

最新回复(0)