深度剖析虚拟继承

来源:互联网 发布:c语言入门pdf下载 编辑:程序博客网 时间:2024/06/10 19:16

虚拟继承函数与普通继承

class Base{public:int _a;};class P :public Base{public:int _b;};class X :virtual public Base{public:int _c;};int main(){//普通继承P p;p._a = 0;p._b = 1;//虚拟继承X x;x._a = 5;x._c = 6;system("pause:");return 0;}

普通继承


虚拟继承


普通继承与虚拟继承的区别:

1.书写形式不同

虚拟继承含关键字virtual。

2.对象模型不同

虚拟继承多了4个字节,这四个字节保存偏移量表格的地址。

偏移表格存放内容:对象相对于自己的偏移量

                                 对象相对于基类成员的偏移量

3.在内存中,普通继承基类部分在前,派生类部分在后;虚拟继承基类部分在后,派生类部分在前。

4.访问方式不同

普通继承函数:直接访问

虚拟继承函数:偏移量表格地址--->偏移量表格---->偏移量---->基类成员

5.构造函数不同

①虚拟继承的派生类合成构造函数,将偏移量表格的地址放在对象的前四个字节;

②Push 1;多了一个参数1,用来区分是否为虚函数。

菱形虚拟继承

class B{public:int _a;};class C1 :virtual public B{public:int _c;};class C2 :virtual public B{public:int _d;};class D :public C1, public C2{private:int _e;};


但是虚拟继承也存在一些缺陷,间接访问,效率低。