博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对象内存布局 (4)
阅读量:6225 次
发布时间:2019-06-21

本文共 1311 字,大约阅读时间需要 4 分钟。

内容概要:

满足下面2个条件时,

1. 父类有虚函数,子类也有虚函数,且子类的虚函数重写或覆盖了父类的虚函数

2. 非虚继承

类对象之内存布局

在前面的例子中,恢复原来的两个虚函数vfBase_1()和vfBase_2(),同时在Derived类中重写基类的虚函数vfBase_1(),Base类和Derived类之间的关系如下图:

  

整个代码如下:

#include 
using namespace std;class Base{public: int m_base; inline virtual void vfBase_1() { cout << "This is in Base::vfBase_1()" << endl; } inline virtual void vfBase_2() { cout << "This is in Base::vfBase_2()" << endl; }};class Derived : public Base{public: int m_derived; inline virtual void vfDerived() { cout << "This is in Derived::vfDerived()" << endl; } inline void vfBase_1() { cout << "This is in Derived::vfBase_1()" << endl; }};typedef void (*VFun)(void);// 改为template形式,因为不能确定传进来的参数是Base类型的指针还是Derived类型的指针template
VFun virtualFunctionPointer(T* b, int i){ return (VFun)(*((int*)(*(int*)b) + i));}int main(void){ Derived d; cout << "The size of Base object = \t" << sizeof(Derived) << endl; cout << endl; int i = 0; while(virtualFunctionPointer(&d, i)) { VFun pVF = virtualFunctionPointer(&d, i++); pVF(); } return 0;}

运行结果:

Derived 对象的memory layout图解如下:

 

 

因为Derived类中重写了虚函数vfBase_1(),所以Derived::vfBase_1()就取代了Base::vfBase_1()的位置,位于虚函数表的开始处。而Base::vfBase_1()就不会再在Derived的虚函数表中出现了。

你可能感兴趣的文章
Eclipse崩溃后无法启动的问题解决
查看>>
Android Studio git ignore
查看>>
springmvc
查看>>
22.2. 用户认证
查看>>
1.7. User interfaces
查看>>
阿里Druid数据连接池在SSM框架中的配置使用
查看>>
基于Metronic的Bootstrap开发框架经验总结(17)-- 使用 summernote插件实现HTML文档的编辑和图片插入操作...
查看>>
Linux虚拟主机通过程序实现二级域名绑定到子目录
查看>>
7.12. cvs diff
查看>>
Android酷炫实用的开源框架(UI框架)
查看>>
Winform开发框架之对话框样式同化
查看>>
一脸懵逼学习Linux的Shell编程
查看>>
Jmeter调试工具---Debug Sampler
查看>>
[裴礼文数学分析中的典型问题与方法习题参考解答]4.5.14
查看>>
impdp的TABLE_EXISTS_ACTION参数选项
查看>>
机器学习之深入理解神经网络理论基础、BP算法及其Python实现
查看>>
ecshop设置一个子类对应多个父类并指定跳转url的修改方法
查看>>
【spring源码学习】spring的事务管理的源码解析
查看>>
遇见喜欢数学的女孩
查看>>
linux进程资源占用高原因分析命令记录
查看>>