对象内存布局 (5)
内容概要:
满足下面3个条件时,
1. 父类有虚函数,子类也有虚函数,且子类的虚函数重写或覆盖了父类的虚函数
2. 非虚继承
3. 多重继承
类对象之内存布局
多重继承,派生类不重写基类中的虚函数。
假定各类之间的关系如下图:
代码如下:
#include <iostream> using namespace std;class Base1 { public:int m_base1;inline virtual void vfBase1_1(){cout << "This is in Base1::vfBase1_1()" << endl;}inline virtual void vfBase1_2(){cout << "This is in Base1::vfBase1_2()" << endl;} }; class Base2 { public:int m_base2;inline virtual void vfBase2_1(){cout << "This is in Base2::vfBase2_1()" << endl;}inline virtual void vfBase2_2(){cout << "This is in Base2::vfBase2_2()" << endl;} }; class Base3 { public:int m_Base3;inline virtual void vfBase3_1(){cout << "This is in Base3::vfBase3_1()" << endl;}inline virtual void vfBase3_2(){cout << "This is in Base3::vfBase3_2()" << endl;} }; class Derived : public Base1, public Base2, public Base3 { public:int m_derived;inline virtual void fd(){cout << "This is in Derived::fd()" << endl;} }; typedef void (*VFun)(void); template<typename T> VFun virtualFunctionPointer(T* b, int i) {return (VFun)(*((int*)(*(int*)b) + i)); } int main(void) {Derived d;cout << "The size of Derived object = \t" << sizeof(Derived) << endl;cout << endl;cout << "1st virtual function table: " << endl;int i = 0;while(virtualFunctionPointer(&d, i)&&i<3){VFun pVF = virtualFunctionPointer(&d, i++);pVF();}cout << endl;cout << "2nd virtual function table: " << endl;i = 0;//以32字长的机器,找到下一个继承base class的vptrint* tmp = ((int*)&d)+ sizeof(Base1)/4;//虚函数表中的虚函数后面不为NULL?如果不加i的限制会出现段错误,不能结束循环while(virtualFunctionPointer(tmp, i)&&i<2){VFun pVF = virtualFunctionPointer(tmp, i++);pVF();}cout << endl;cout << "3rd virtual function table: " << endl;i = 0;tmp = ((int*)&d) +(sizeof(Base1)+sizeof(Base2))/4;while(virtualFunctionPointer(tmp, i)&&i<2){VFun pVF = virtualFunctionPointer(tmp, i++);pVF();}return 0; }
运行结果:
Derived对象之memory layout如下:
(表中的Base::vfBase1_1应该是Base1::vfBase1_1,其余的类推)
由上面的分析可知:
其一:有三个虚函数表
其二:在Derived类中定义的虚函数Derived::vfDerived()附加在一个虚函数表的最后
(注意:多重继承有多个虚函数表)
转载于:https://www.cnblogs.com/wuchanming/p/4091164.html
对象内存布局 (5)相关推荐
- 【C++】C++对象模型:对象内存布局详解(C#实例)
C++对象模型:对象内存布局详解 0.前言 C++对象的内存布局.虚表指针.虚基类指针解的探讨,参考. 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个概念可 ...
- C++对象内存布局--①测试虚函数表属于类
C++对象内存布局--①测试虚函数表属于类 测试1:同一个类的多个对象共享同一张虚函数表. //虚函数表.cpp //2010年8月18日 //测试虚函数表,说明虚函数表属于类所有.同一个类的多个 ...
- C++对象内存布局--⑤GCC编译器--单个虚拟继承
C++对象内存布局--⑤GCC编译器--单个虚拟继承 测试GNU的GCC编译器在处理虚拟继承上跟VS不同的地方.派生类的虚函数表跟虚基类表合并. //GCC编译器--单个虚拟继承.cpp //2010 ...
- C++ 对象内存布局 (4)
注意:关于内存对齐(memory alignment),请看关于内存对齐问题,后面将会用到. 下面我们进行在普通继承(即非虚继承)时,派生类的指针转换到基类指针的情形研究.假定各类之间的关系如下图: ...
- C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中
C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中 测试2:证明派生类的虚函数的地址跟第一基类的虚函数地址保存在同一张虚函数表中. 派生类有多少个拥有虚函数的基类,派生类对象就有多少 ...
- C++对象内存布局--④VS编译器--单个虚拟继承
C++对象内存布局--④VS编译器--单个虚拟继承 在VS2005编译器下,证明单个虚拟继承的内存布局:无论有无虚函数,必然含有虚基类表指针.虚基类表中的内容为本类实例的偏移和基类实例的相对偏移值. ...
- C字节对齐与C++类对象内存布局
一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问, ...
- C++对象内存布局测试总结
C++对象内存布局测试总结 http://hi.baidu.com/����/blog/item/826d38ff13c32e3a5d6008e8.html 上文是半年前对虚函数.虚拟继承的理解.可能 ...
- java char占用多少字节_Java虚拟机:Java对象大小、对象内存布局及锁状态变化
一个对象占多少字节? 关于对象的大小,对于C/C++来说,都是有sizeof函数可以直接获取的,但是Java似乎没有这样的方法.不过还好,在JDK1.5之后引入了Instrumentation类,这个 ...
- JOL(java object layout --java 对象内存布局)
JOL(java object layout --java 对象内存布局) ⚠⚠⚠本文以java普通对象为切入点,分析java的对象内存布局,数组见文末 maven地址
最新文章
- 米扑博客:总结分享 WordPress显示评论者IP归属地、浏览器、终端设备、电信运营商...
- Spring MVC 函数式编程进阶
- 1.21 Lambda表达式
- form表单提交数据编码方式和tomcat接受数据解码方式
- aic bic mdl
- SQL基础【十六、Union】
- Python从键盘输入多行文本数据的方法
- #3771. Triple(生成函数 + 容斥)
- 北大计算机类学什么,状元们去清华北大选了什么专业?计算机可不是首选,首选你想不到...
- windows下搭建iphone开发环境
- 【CSS3】 理解CSS3 transform中的Matrix(矩阵)
- 使用ubuntu 10.04中的中文乱码问题解决
- 多线程CountDownLatch和Join
- Linux命令之文件与文件夹的拷贝
- 视频格式转换(avi、wmv、flv、mkv、rmvb、rm、3gp转MP4、MP3)边学边开发
- 今天去地坛书市淘书了
- linux生成checksum,SF2281修改Lic授权ID生成新checksum生成器
- 《孩子,你慢慢来》的读书笔记与读后感2600字
- Java实践(五)仿照用户列表查询写查自己的库
- 华三 mstp-路由聚合-ospf-三层聚合 入门全套实验
热门文章
- k8s中使用MySQL共享存储_Kubernetes创建挂载共享存储的容器
- 疯狂html5+css3+javascript讲义 pdf_成为一名优秀的HTML5前端工程师需要掌握哪些技能?...
- 测试电梯的测试用例_【转】电梯功能的测试用例和测试方案
- gis怎么通过水库划分子流域_ArcGIS提取小流域——以北京为例,提取出密云水库...
- python 列表解析式_python列表解析式,字典解析式,集合解析式和生成器
- sql程序调用批处理_批处理学习之常用命令
- java home not set_Error: JAVA_HOME is not set and could not be found.
- html5+css3网页开发实战精解,HTML5+CSS3开发实战
- 手机号脱敏处理_C#简单代码实现对手机号邮箱等隐私信息进行*号打码
- linux 开发组织模式,Linux内核发布模式与开发组织模式(1)