虚继承的内存布局手札1——基于VS2012

1、纸上得来总觉浅,低头debug才深刻。

对于《深度探索C++对象模型》这类型的书,得到的知识要去及时巩固才能实现永久记忆。


2、在实现了了虚拟继承归并分支之后的内容布局跟虚表的可复用存在极大关系。

继承的顺序决定了A和B的布局顺序,然后Common则在高地址,即公虚基类的布局放在D的尾部。


情况1:

class A:public virtual Common{...};

class B:public virtual Common{...;virtual void NotInCommon(){}};

class D:public A,public B{...}

内存布局则是:

D{A,B,Common}; A和Common共用一张虚表


情况1:

class A:public virtual Common{...};

class B:public virtual Common{...;virtual void NotInCommon(){}};

class D:public B,public A{...}

内存布局则是:

D{B,A,Common};从低地址忘高地址(对应从上到下的视图)。


继承列表在某种程度上相当于变量声明,声明的是该位置存放的是某个基类。D、A、Common公用一张虚表。优先调整为能满足单继承的状态(待续。),而B则通过偏移。如果在VS中是看不到当前类的虚表指针——这不科学,怎么可能找不到,其实虚表指针就是和最后的一个父类对象使用公用一个虚表指针变量。但是由于视图是基类对象,也就说看不到此派生对象多增加的虚函数。待续。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值