现在的位置: 首页 > 综合 > 正文

C++多重继承内存结构

2014年03月12日 ⁄ 综合 ⁄ 共 968字 ⁄ 字号 评论关闭

写的很清晰:http://blog.csdn.net/haoel/article/details/3081328

这个也不错:http://blog.csdn.net/fairyroad/article/details/6376620

     A

B1     B2

     C

这里B1和B2继承A,C继承B1,B2。A指的是顶层类,C指最底层类

普通继承子类只是简单的把父类包含进来(非静态成员变量和虚表指针,但是虚表指针和指向的虚表都是自己独有的,和父类不一样),虚拟继承子类会把父类结构放在最后。

多重继承就是多个普通继承,父类会按照顺序被包含,如果出现“菱形继承结构”则顶层类会被最下面的子类包含多次。虚拟多重继承会把由virtual继承来的顶层类放在最后只有一份“实体”,我猜测放在最后是便于在最底层类继承时实现多个重复顶层类的合并,从而保证顶层类只有一份实体。

当一个子类继承了很多父类后,将其转换赋给一个父类指针或是再由父类指针向下转换,就是在子类庞大的内存结构中做地址调整以找到相应的父类位置,目前我的脑子只能理解到上面简单的菱形结构,实际应用中复杂的继承体系内存布局想想脑子就乱了,还是交给编译器吧。。。

很重要的一点:多重继承子类指针和第一个继承的父类指针地址相同


函数:

成员函数其实就是C函数加个具体对象的指针参数(this),非静态成员变量是放在每个对象中的。

静态成员函数没有this参数,所以就不能访问具体对象的成员变量了,只能访问static变量,static变量应该是存放在内存的全局区域。

虚函数是vptr+虚表来管理,我理解虚函数物理存放形式和成员函数没啥区别,只不过调用时候先要经过vptr+虚表处理一下。



摘抄几段重要的话:

l  非静态数据成员都存放在对象所跨有的地址空间中,静态数据成员则存放于对象所跨有的地址空间之外;

l  非虚拟成员函数(静态和非静态)也存放于对象所跨有的地址空间之外,且编译器将其改写为普通的非成员函数的形式(以求降低调用开销);

l  对于虚拟成员函数,则借助vtblvptr支持。

l  对于继承关系,子类对象跨有的地址空间中包含了父类对象的实体,通过嵌入type-info信息进行识别和虚函数调用。


2年前看过<Inside C++ object model> 当时看懂了30%就不错,看了这两篇文章才慢慢理解

抱歉!评论已关闭.