前面我们已经知道, 在没有虚函数的时候, 对象的大小就是对应的成员变量的大小, 而成员函数不会占用对象的空间, 今天我们来讨论一下, 当类中定义了虚函数的时候, 此时对象的大小以及对象模型

非继承下的对象模型

class Base
{
public:virtual void func1(){cout << "Base::func1()" << endl;}virtual void func2(){cout << "Base::func2()" << endl;}
private:int a;
};
void Test1()
{Base b1;
}

此时打开编译器, 观察 b1 的对象模型如下图所示

此时我们会发现对象b1 它除了有一个成员变量 a 之外, 它还有一个虚函数表, 这个虚函数表的数据结构是由一个指针数组来维护的, 这个指针数组中存放了指向虚函数的指针, 并且指向虚函数指针的结束标识在VS下是以一个0为结束标识, 也就是说 b1的对象模型如下图所示

单继承下的对象模型

class Base
{
public:virtual void func1(){cout << "Base::func1()" << endl;}virtual void func2(){cout << "Base::func2()" << endl;}
private:int a;
};class Derive :public Base
{
public:virtual void func1(){cout << "Derive: func1()" << endl;}virtual void func3(){cout << "Derive: func3()" << endl;}virtual void func4(){cout << "Derive: func4()" << endl;}
private:int b;
};typedef  void(*VFUNC)();void PrintVTable(int* VTable)
{cout << "虚表地址: " << VTable << endl;int i = 0;for(; VTable[i] != 0; i++){printf("第 %d 个虚函数地址: 0x%x -> ", i, VTable[i]);VFUNC f = (VFUNC)VTable[i];f();}cout << endl;
}void Test1()
{Base b1;Derive d1;int*VTable1 = (int*)(*(int*)(&b1));int*VTable2 = (int*)(*(int*)(&d1));PrintVTable(VTable1);PrintVTable(VTable2);
}

为了方便起见, 我们将对应的虚表打印出来, 此时会发现如下现象

接下来探索一下对应的 b1 和 d1 的对象模型

多继承对象模型

class Base1
{
public:virtual void func1(){cout << "Base1::func1()" << endl;}virtual void func2(){cout << "Base1::func2()" << endl;}
private:int b1;
};class Base2
{
public:virtual void func1(){cout << "Base2::func1()" << endl;}virtual void func2(){cout << "Base2::func2()" << endl;}
private:int b2;
};
class Derive :public Base1, public Base2
{
public:virtual void func1(){cout << "Derive: func1()" << endl;}virtual void func3(){cout << "Derive: func3()" << endl;}
private:int b;
};

此时的对象模型如下图所示

C++::探索对象模型相关推荐

  1. Th3.10:RTTI、dynamic_cast、typeid简介

     本博客将记录:类的相关知识点的第10节的笔记! 今天 总结的这5个知识点都是之前我coding中接触得非常少的,因此务必要重视这一章! 今天总结的知识分为以下5个点: 一.RTTI是什么? 二.dy ...

  2. C++的黑科技(深入探索C++对象模型)

    周二面了腾讯,之前只投了TST内推,貌似就是TST面试了 其中有一个问题,"如何产生一个不能被继承的类",这道题我反反复复只想到,将父类的构造函数私有,让子类不能调用,最后归结出一 ...

  3. 《深度探索C++对象模型》--5 构造析构拷贝 6 执行期语意学

     <深度探索C++对象模型>--5构造.析构.拷贝语意学 1.纯虚函数: (1)C++可以定义和调用一个纯虚函数,不过只可以静态调用,不可以由虚拟机制调用. 注意:pure virtu ...

  4. 深度探索C++ 对象模型(7)-Data member的布局(虚继承)

    虚拟继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...

  5. 深度探索C++ 对象模型(7)-Data member的布局(多重继承)

    多重继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...

  6. 深度探索C++ 对象模型(7)-Data member的布局(无继承、继承无多态、继承多态、多层继承)

    无继承 继承无多态 继承多态 虚表 : 用来存放基类的每一个虚函数,再加上首位的一个slots(支持RTTI). 每个class object导入一个vptr,提供执行期的链接,使得每一个class ...

  7. 深度探索C++ 对象模型(6)-Data member的存取

    nonstatic data member 需要在class object起始地址加上该member的偏移. class A {public: int x; int y;}; A a; a.y = 0 ...

  8. 深度探索C++ 对象模型(6)-Data member的绑定

    防御性程序设计 1).将class声明起头处放data member; 代码示例: class Point3d{ float x,y,z; public://etc } 2). class的声明处放i ...

  9. 深度探索C++ 对象模型(5)-Initialization list(3)

    四点: 1.list中的项目次序是由class中的members声明次序决定,不是由initialization list中的的代码决定 如下代码有一个陷阱,i值为一个不可预知未初始化的值.原因是按照 ...

最新文章

  1. Angular的ChangeDetectorRef.detectChanges()实现angularJS的$apply()方法,强制刷新数据渲染
  2. 计算机科学导论链式存储,计算机科学导论3.pdf
  3. 按键精灵脚本 php,HTML_按键精灵 脚本-学习VBS的一个不错的教程,今天我就从总体上对VBS进行介 - phpStudy...
  4. Google VR全景图片与视频功能开发详解
  5. 网易云信助春招上“云” ,疫情过后线上招聘或成常态
  6. WebService(JAX-WS、XFire、Axis三种)获取客户端ip
  7. 10个Linux 系统性能监控命令行工具
  8. spotify歌曲下载_使用Spotify数据预测哪些“ Novidades da semana”歌曲会成为热门歌曲
  9. 实战03_SSM整合ActiveMQ支持多种类型消息
  10. 苹果XR信号差,可否要求苹果公司召回?
  11. ElementUI 按需引入坑爹的点记录
  12. HTML5中最重要的技术点有哪些
  13. android手机录屏工具,安卓手机上有什么好用的屏幕录屏软件可以推荐?
  14. 计算机管理磁盘分区,一分钟搞定电脑磁盘分区,再也不求人!
  15. 函数的正交与向量正交
  16. AVM环视拼接方法介绍
  17. SecureCRTSecureFX Portable远程连接Linux;上传下载文件
  18. 常见设计模式快速记忆
  19. win10自带邮箱怎么服务器,win10系统查看邮箱服务器信息的操作方法
  20. 盛世昊通:工信部第351批即将上市的汽车履历表

热门文章

  1. [Linux] 权限与指令间的关系
  2. 分解质因数-洛谷P3200 [HNOI2009]有趣的数列
  3. Linq to SQL 的增删改查操作
  4. redis学习笔记——(1)
  5. linux 命令案例学习——文件搜索
  6. ruhr启动mysql数据库_Mysql表类型(存储引擎)的选择
  7. python全栈开发内容_Python全栈开发之Day02
  8. php 注册自动登录,php – 创建第二个自动登录用户的登录页面
  9. 帝国模板php代码,让帝国cms搜索页模板支持php代码
  10. 28岁学python转行_28岁转行程序员,学Java还是Python?码农:想快点月薪过万就选它...