C++多重继承内存结构
来源:互联网 发布:sqlserver linux 原理 编辑:程序博客网 时间:2024/05/16 23:41
写的很清晰: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 对于虚拟成员函数,则借助vtbl和vptr支持。
l 对于继承关系,子类对象跨有的地址空间中包含了父类对象的实体,通过嵌入type-info信息进行识别和虚函数调用。
2年前看过<Inside C++ object model> 当时看懂了30%就不错,看了这两篇文章才慢慢理解
- C++多重继承内存结构
- 多重继承的内存结构分析
- (C++)多重继承
- C++--多重继承
- 菱形结构的多重继承
- 多重继承和菱形结构
- 多重继承内存布局分析
- 多重继承的内存分配
- 多重继承的内存分配
- C++-继承:多重继承 && 虚拟继承
- 虚函数: 多重继承下派生类对象的内存结构
- C++【多重继承和虚继承】
- 采用多重继承模仿文档视图结构
- 【C++】c++单继承、多继承、菱形继承内存布局(虚函数表结构)
- 【C++】c++单继承、多继承、菱形继承内存布局(虚函数表结构)
- C++继承、多重继承与虚基类 继承、多重继承时对象内存分布
- C++继承、多重继承与虚基类 继承、多重继承时对象内存分布
- 多重虚继承的内存模型分析
- u-boot Makefile完全解读
- RS-232
- Android LayoutInflater的使用 .
- 无聊测试下php5多重继DEMO简单实现方法
- C++操作符重载
- C++多重继承内存结构
- Linux终端设备详解
- 一段可以让整个网站变黑白代码
- 比较好的网站
- Comparable接口和Comparator接口
- 基于Jquery的颜色选择器
- Linux 下 Redis 安装详解
- 如何实现验证码输入正确与否的判断?
- 安装nexus遇到的问题