C++中虚继承下派生类object布局
来源:互联网 发布:搭建apache服务器性能 编辑:程序博客网 时间:2024/06/05 09:18
C++虚继承下派生类object布局
目录
一. 背景知识... 2
1.1. 虚函数表(vftable)2
1.2. 虚基表(vbtable)... 2
二. 场景分析... 3
2.1. 全部都是虚基类... 3
2.2. 有的基类不是虚基类... 3
一. 背景知识
如果您觉得错误之处可以随时联系我,还请多多关照。
1.1. 虚函数表(vftable)
虚函数表中保存着一个类所有虚函数的地址。继承时会更新虚函数覆盖后的新地址。编译器将在该类的object中插入一个vfptr指针,并在该object初始化的时候让vfptr指向该表。一个派生类可以有多个vftable,有的编译器将对此进行优化,合成一个表,每个子表中需要包含其首地址到第一个vftable的偏移量。但是object的vfptr指针还是会有多个。
1.2. 虚基表(vbtable)
虚基表和虚函数表类似,不过存储的不是地址,而是偏移量,每个派生类对象中有一个vbptr指针指向该表,第一个偏移量是派生类object自身的vbptr指针到其首地址的偏移量,之后依次存储每个虚基类subobjects与该vbptr指针之间的偏移量。
二. 场景分析
2.1. 全部都是虚基类
如果派生类有自己特有的虚函数的话,编译器将创建一个新的vftable,并在派生类object首地址插入一个vfptr指向该表,然后依次是vbptr,每个object只有一个vfptr和一个vbptr,而且vfptr在vbptr之前,其他的vfptr和vbptr属于虚基类subobjects的。两个指针之后就是派生类自己的nonstatic data member了。后面的话是虚基类各自的subobjects。
2.2. 有的基类不是虚基类
从派生列表中依次找,找到第一个含有虚函数表的基类,将其subobjects放在派生类object首地址,之后安排其他nonvirtual base class的subobjects,这些都排列完毕之后才是派生类自己的vbptr,vbptr指针后面跟着自己的nonstatic data members,之后才是virtual base class subobjects。
- C++中虚继承下派生类object布局
- 含有虚函数多重继承派生类内存布局
- 继承---派生类(C++)
- [C++]继承和派生类
- C++: 类的继承派生
- O-c中类的继承与派生的概念
- C++ 继承派生类中的内存布局
- object-c中类的继承
- 【c++】实例演示类继承中派生类到基类的转换及虚函数
- C语言中 继承与派生
- c++中继承和派生在内存的布局
- C语言类的继承和派生
- C++: 继承与派生
- 继承与派生(C++)
- C++----继承和派生
- C++:继承与派生
- 【C++】继承和派生
- C++继承 派生类中的内存布局(单继承、多继承、虚拟继承)
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- JSON for java入门总结
- 《Machine Learning(Tom M. Mitchell)》读书笔记——13、第十二章
- 学生信息链表实现
- Restore IP Addresses
- C++中虚继承下派生类object布局
- 【安卓笔记】滑动删除示例
- 在centos安装ncftp
- 打电话就赚钱 加值电话合作 声讯电话
- LCA倍增法
- 25. Dubbo原理解析-telnet
- const iterator 和 const_iterator 的区别
- LeetCode Unique Paths
- ZigBee组网学习笔记(五)--无线数据传输