首页 > 代码库 > 虚继承的内存布局手札1——基于VS2012

虚继承的内存布局手札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中是看不到当前类的虚表指针——这不科学,怎么可能找不到,其实虚表指针就是和最后的一个父类对象使用公用一个虚表指针变量。但是由于视图是基类对象,也就说看不到此派生对象多增加的虚函数。待续。


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