Cpp 对象模型探索 / 含有虚基类的类的内存布局
一、栗子
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 类的内存布局。
四、总结
- 若 Grand 类为虚基类,则 Parent 类和 Son 类的内存布局中,该虚基类会排布在该类的最下面。
- 若父类是虚基类,则子类会生成 vbptr,该指针指向 vbtable 。后序会讲解。
- 对于 Son 类来说,因为其并没有虚继承父类,故其本身没有 vbptr 。
五、其他
- vbtable,英文全称:virtual base table,中文名称:虚函数表。
- vbptr,英文全称:vritual base table pointer,中文名称:虚函数表指针。
(SAW:Game Over!)
Cpp 对象模型探索 / 含有虚基类的类的内存布局相关推荐
- Cpp 对象模型探索 / 多重继承下基类指针释放子类对象的原理说明(虚析构函数的作用)
源码 #include <iostream>class Base1 { public:virtual void func_1_1(){ std::cout << "B ...
- Cpp 对象模型探索 / 带有虚继承类的构造函数的调用顺序
栗子 #include <iostream> class A { public:A() { std::cout << "A" << std::e ...
- Cpp 对象模型探索 / 多重继承虚函数表分析
一.源码 #include <iostream>class Base1 { public:virtual void func11(){std::cout << "Ba ...
- Cpp 对象模型探索 / 单一继承的类的内存布局
目录 1.父类和子类都没有虚函数 2.父类有虚函数.子类没有虚函数 3.父类没有虚函数,子类有虚函数 4.父类和子类都有虚函数 5.总结 #include <iostream> class ...
- Cpp 对象模型探索 / 系列文章的索引
一.对象 普通类对象占用的空间. 子类的内存布局. 编译器为对象创建缺省构造函数的条件. 二.虚函数(完) 对象的虚函数表指针的位置. 继承关系下的虚函数手动调用. 虚函数表和虚函数表指针的创建时机. ...
- Cpp 对象模型探索 / 编译器为对象创建缺省构造函数的条件
零.前言 书本上常说,编译器会给没有任何构造函数的类自动创建一个缺省的构造函数(没有形参的构造函数).但是事实上不是这样么?栗子: class A { public:int i; };int main ...
- Cpp 对象模型探索 / 虚基类表作用
一.结论 虚基类表的作用是帮助编译器找到该类中的虚基类中各个成员变量在内存布局中的位置. 虚基类表中的值是偏移值,即:各个虚基类的成员变量在子类中的内存布局中相对于虚函数指针的偏移值. 二.栗子 1. ...
- Cpp 对象模型探索 / 类引入虚函数有哪些成本?
编译时会为类对象引入虚函数表. 类对象中会产生虚函数表指针 vptr,用于指向虚函数表. 在对象的构造函数中插入向 vptr 赋值虚函数表的首地址的代码. 若是多重继承,每个父类均有虚函数,那么子类会 ...
- Cpp 对象模型探索 / 继承关系下的虚函数手动调用
一.多态机理 #include <iostream>class Father { public:virtual void Func1(){std::cout << " ...
最新文章
- Hadoop 2.2.0安装和配置lzo
- 取代java_为什么C++没有被java取代
- Java IdentityHashMap size()方法与示例
- eclipse启动报错 Problems occurred when invoking code from plug-in: org.eclipse.jface
- 新的 CSS 攻击会导致 iOS 系统重启或 Mac 冻结
- nginx limit_req限速设置
- VC++实现快速截屏
- 希腊数字matlab,latex 希腊数字
- t检验及python代码实现
- 坚持分享的魅力,我超越了当年的榜样
- 交通灯—VHDL设计
- selenium python怎么断言_请问selenium python 断言怎么写?
- 量子十问之四:“薛定谔猫”为什么会自然死亡?
- Oracle Golden Gate 系列一 -- GG 架构 说明
- IE主页无法修改的办法
- 微信小程序获取openid失败
- 引用qcustomplot编译错误undefined reference to `_imp___ZN8QPrinterC1ENS_11PrinterModeE'
- 【Java学习笔记之七】java函数的语法规则总结
- Oracle-数据泵使用
- mount / umount命令