C++对象模型探索 / 子类的内存布局
一、栗子
#include <iostream>class Father
{
public:Father(){std::cout << "I am father,this is " << this << std::endl;}public:void func_father(){std::cout << "传入 Fahter::func_father() 的 this 指针是 " << this << std::endl;}
private:int father;
};class Mother
{
public:Mother(){std::cout << "I am Mother,this is " << this << std::endl;}public:void func_mother(){std::cout << "传入 Mother::func_mother() 的 this 指针是 " << this << std::endl;}
private:int mother;
};class Son : public Father,public Mother
{
public:Son(){std::cout << "I am Son,this is " << this << std::endl;}public:void func_Son(){std::cout << "传入 Son::func_Son() 的 this 指针是 " << this << std::endl;}
private:int son;
};int main()
{Son s;std::cout << std::endl;s.func_father();s.func_mother();s.func_Son();return 0;
}
结果:
I am father,this is 0xffffcc14
I am Mother,this is 0xffffcc18
I am Son,this is 0xffffcc14传入 Fahter::func_father() 的 this 指针是 0xffffcc14
传入 Mother::func_mother() 的 this 指针是 0xffffcc18
传入 Son::func_Son() 的 this 指针是 0xffffcc14
二、详解
由上述代码可知,子类的内存布局如下图所示,
由于“Son”继承顺序是“Father”、“Mother”,所以内存布局中 Father 类排布在起始位置,之后是 Mother 类,最后才是 Son 类自身的变量(当然,初始化顺序也是 Father 、Mother,最后才是 Son )。
具体为什么内存布局中只有变量而没有函数的原因,请看链接。
最后还有一个问题,为什么 Son 的对象调用可以调用 Father 和 Mother 类的函数呢?因为编译器在调用 Father 和 Mother 的函数时,调整了传入到 Func_Father 和 Func_Mother 函数的 this 指针,使 this 指针是各个函数所在类的对象的 this 指针,从而达到了调用各个类的函数的目的。
(SAW:Game Over!)
C++对象模型探索 / 子类的内存布局相关推荐
- Cpp 对象模型探索 / 虚继承带虚函数的基类的子类的内存布局
源码 class Base { public:Base() {}virtual void func() {}int bi_; };class Son:virtual public Base { pub ...
- Java虚拟机对象的探索—对象的内存布局
在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header).实例数据(Instance Data)和对齐填充(Padding). 对象头(Header) HotSpo ...
- 【C++】C++对象模型:对象内存布局详解(C#实例)
C++对象模型:对象内存布局详解 0.前言 C++对象的内存布局.虚表指针.虚基类指针解的探讨,参考. 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个概念可 ...
- 图说C++对象模型:对象内存布局详解
目录 1.何为C++对象模型? 2.文章内容简介 3.理解虚函数表 3.1.多态与虚表 3.2.使用指针访问虚表 4.对象模型概述 4.1.简单对象模型 4.2.表格驱动模型 4.3.非继承下的C++ ...
- Cpp 对象模型探索 / 系列文章的索引
一.对象 普通类对象占用的空间. 子类的内存布局. 编译器为对象创建缺省构造函数的条件. 二.虚函数(完) 对象的虚函数表指针的位置. 继承关系下的虚函数手动调用. 虚函数表和虚函数表指针的创建时机. ...
- 【C++拾遗】 从内存布局看C++虚继承的实现原理
2019独角兽企业重金招聘Python工程师标准>>> 原创作品,转载请标明:http://blog.csdn.net/xiejingfa/article/details/48028 ...
- 抽象类继承多个抽象类_多重继承?抽象类?C++的内存布局并不复杂
多重继承 先来看看多重继承吧 class 先来看构造函数 ...... 001917DD pop ecx 001917FC mov ecx,dword ptr [this] ;取出this指针 001 ...
- Cpp 对象模型探索 / 单一继承的类的内存布局
目录 1.父类和子类都没有虚函数 2.父类有虚函数.子类没有虚函数 3.父类没有虚函数,子类有虚函数 4.父类和子类都有虚函数 5.总结 #include <iostream> class ...
- Cpp 对象模型探索 / 含有虚基类的类的内存布局
一.栗子 class Grand { public:int i_grand_ = 8; };class Parent1 : public virtual Grand { public:int i_pa ...
最新文章
- 7行Python代码,搭建可以识花的机器学习App|视频教程
- Java 程序员必备的 15 个框架,前 3 个地位无可动摇!
- 每日一皮:程序员新手尝试新框架的时候
- 《设计模式》一书PPT浏览及下载地址
- unity怎么实现人脸追踪_Unity 2019.2 beta为AR增加面部追踪、2D图像追踪、3D对象追踪等功能...
- idea删除module
- Silverlight4.0教程之WebBrowser控件(Silverlight内置HTML浏览器控件)
- 运营级IOS一键签名程序源码 支持app超级签名一键分发平台
- Git如何进行减少提交历史数量以及修改自己的commit中的邮箱
- Extjs 代码拾穗
- powershell 设置代理_WSL2中使用proxychains ng代理加速
- 三维重建笔记_SLAM简介
- EDA技术实用教程 | 复习二 | Verilog基本语法
- netty 百度网盘 密码
- excel熵值法计算权重_SPSSAU一众新功能上线:高级公式、综合得分一键计算
- xcel Home 数据透视表初级班(10118班)小结第二课时
- 重测序群体遗传进化分析之进化树构建
- 赠书 |“硅谷精神之父”凯文·凯利:5000 天后的 “AI” 世界
- java使用jol打印对象信息
- 我们的管理:部门管理