一、栗子

class Grand
{
public:int i_grand_ = 8;
};class Parent1 : public virtual Grand
{
public:int i_parent1_ = 9;
};class Parent2 : public virtual Grand
{
public:int i_parent2_ = 10;
};class Son : public Parent1,public Parent2
{
public:int i_son_ = 11;
};int main()
{return 0;
}

打开 Developer Command Prompt for VS 2019 ,当前目录切换到该工程所在目录,执行如下指令:

cl /d1 reportSingleClassLayoutParent1 test1.cpp1、cl    "l"是小写的“L”。
2、d1    “1”是数字“1”。
3、“reportSingleClassLayoutParent1” 是 “reportSingleClassLayout” + 类名,即:要查看数据结构的/类的名字。
4、"test1.cpp",该类所在的代码文件。

二、Parent 类的内存布局

执行指令

cl /d1 reportSingleClassLayoutParent1 test1.cpp

得到如下图所示的结果

根据上图得到下图所示的 Parent1 类的内存布局。

三、Son 类的内存布局

执行指令

cl /d1 reportSingleClassLayoutSon test1.cpp

得到如下图所示的结

根据上图得到下图所示的 Son 类的内存布局。

四、总结

  1. 若 Grand 类为虚基类,则 Parent 类和 Son 类的内存布局中,该虚基类会排布在该类的最下面。
  2. 若父类是虚基类,则子类会生成 vbptr,该指针指向 vbtable 。后序会讲解。
  3. 对于 Son 类来说,因为其并没有虚继承父类,故其本身没有 vbptr 。

五、其他

  1. vbtable,英文全称:virtual base table,中文名称:虚函数表。
  2. vbptr,英文全称:vritual base table pointer,中文名称:虚函数表指针。

(SAW:Game Over!)

Cpp 对象模型探索 / 含有虚基类的类的内存布局相关推荐

  1. Cpp 对象模型探索 / 多重继承下基类指针释放子类对象的原理说明(虚析构函数的作用)

    源码 #include <iostream>class Base1 { public:virtual void func_1_1(){ std::cout << "B ...

  2. Cpp 对象模型探索 / 带有虚继承类的构造函数的调用顺序

    栗子 #include <iostream> class A { public:A() { std::cout << "A" << std::e ...

  3. Cpp 对象模型探索 / 多重继承虚函数表分析

    一.源码 #include <iostream>class Base1 { public:virtual void func11(){std::cout << "Ba ...

  4. Cpp 对象模型探索 / 单一继承的类的内存布局

    目录 1.父类和子类都没有虚函数 2.父类有虚函数.子类没有虚函数 3.父类没有虚函数,子类有虚函数 4.父类和子类都有虚函数 5.总结 #include <iostream> class ...

  5. Cpp 对象模型探索 / 系列文章的索引

    一.对象 普通类对象占用的空间. 子类的内存布局. 编译器为对象创建缺省构造函数的条件. 二.虚函数(完) 对象的虚函数表指针的位置. 继承关系下的虚函数手动调用. 虚函数表和虚函数表指针的创建时机. ...

  6. Cpp 对象模型探索 / 编译器为对象创建缺省构造函数的条件

    零.前言 书本上常说,编译器会给没有任何构造函数的类自动创建一个缺省的构造函数(没有形参的构造函数).但是事实上不是这样么?栗子: class A { public:int i; };int main ...

  7. Cpp 对象模型探索 / 虚基类表作用

    一.结论 虚基类表的作用是帮助编译器找到该类中的虚基类中各个成员变量在内存布局中的位置. 虚基类表中的值是偏移值,即:各个虚基类的成员变量在子类中的内存布局中相对于虚函数指针的偏移值. 二.栗子 1. ...

  8. Cpp 对象模型探索 / 类引入虚函数有哪些成本?

    编译时会为类对象引入虚函数表. 类对象中会产生虚函数表指针 vptr,用于指向虚函数表. 在对象的构造函数中插入向 vptr 赋值虚函数表的首地址的代码. 若是多重继承,每个父类均有虚函数,那么子类会 ...

  9. Cpp 对象模型探索 / 继承关系下的虚函数手动调用

    一.多态机理 #include <iostream>class Father { public:virtual void Func1(){std::cout << " ...

最新文章

  1. Hadoop 2.2.0安装和配置lzo
  2. 取代java_为什么C++没有被java取代
  3. Java IdentityHashMap size()方法与示例
  4. eclipse启动报错 Problems occurred when invoking code from plug-in: org.eclipse.jface
  5. 新的 CSS 攻击会导致 iOS 系统重启或 Mac 冻结
  6. nginx limit_req限速设置
  7. VC++实现快速截屏
  8. 希腊数字matlab,latex 希腊数字
  9. t检验及python代码实现
  10. 坚持分享的魅力,我超越了当年的榜样
  11. 交通灯—VHDL设计
  12. selenium python怎么断言_请问selenium python 断言怎么写?
  13. 量子十问之四:“薛定谔猫”为什么会自然死亡?
  14. Oracle Golden Gate 系列一 -- GG 架构 说明
  15. IE主页无法修改的办法
  16. 微信小程序获取openid失败
  17. 引用qcustomplot编译错误undefined reference to `_imp___ZN8QPrinterC1ENS_11PrinterModeE'
  18. 【Java学习笔记之七】java函数的语法规则总结
  19. Oracle-数据泵使用
  20. mount / umount命令

热门文章

  1. 十三、流程控制之if语句
  2. D触发器Verilog描述
  3. Windows系统顽固型文件清除方法
  4. 前端月趋势榜:6 月新增的、最热门的 20 个前端开源项目 - 2106
  5. vue-router常见问题解决方案。(滚轴回到顶部、页面跳转同一页面报错、手机电脑端路由跳转)
  6. word文档出现方格乱码
  7. 无限试用CrossOver 15天的办法
  8. Spring Tools 4 for Visual Studio Code
  9. Apollo后台配置:添加部门
  10. Hadoop MapReduce入门程序wordcount代码示例及打包部署运行结果演示