一、栗子

#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++对象模型探索 / 子类的内存布局相关推荐

  1. Cpp 对象模型探索 / 虚继承带虚函数的基类的子类的内存布局

    源码 class Base { public:Base() {}virtual void func() {}int bi_; };class Son:virtual public Base { pub ...

  2. Java虚拟机对象的探索—对象的内存布局

    在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header).实例数据(Instance Data)和对齐填充(Padding). 对象头(Header) HotSpo ...

  3. 【C++】C++对象模型:对象内存布局详解(C#实例)

    C++对象模型:对象内存布局详解 0.前言 C++对象的内存布局.虚表指针.虚基类指针解的探讨,参考. 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个概念可 ...

  4. 图说C++对象模型:对象内存布局详解

    目录 1.何为C++对象模型? 2.文章内容简介 3.理解虚函数表 3.1.多态与虚表 3.2.使用指针访问虚表 4.对象模型概述 4.1.简单对象模型 4.2.表格驱动模型 4.3.非继承下的C++ ...

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

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

  6. 【C++拾遗】 从内存布局看C++虚继承的实现原理

    2019独角兽企业重金招聘Python工程师标准>>> 原创作品,转载请标明:http://blog.csdn.net/xiejingfa/article/details/48028 ...

  7. 抽象类继承多个抽象类_多重继承?抽象类?C++的内存布局并不复杂

    多重继承 先来看看多重继承吧 class 先来看构造函数 ...... 001917DD pop ecx 001917FC mov ecx,dword ptr [this] ;取出this指针 001 ...

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

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

  9. Cpp 对象模型探索 / 含有虚基类的类的内存布局

    一.栗子 class Grand { public:int i_grand_ = 8; };class Parent1 : public virtual Grand { public:int i_pa ...

最新文章

  1. 7行Python代码,搭建可以识花的机器学习App|视频教程
  2. Java 程序员必备的 15 个框架,前 3 个地位无可动摇!
  3. 每日一皮:程序员新手尝试新框架的时候
  4. 《设计模式》一书PPT浏览及下载地址
  5. unity怎么实现人脸追踪_Unity 2019.2 beta为AR增加面部追踪、2D图像追踪、3D对象追踪等功能...
  6. idea删除module
  7. Silverlight4.0教程之WebBrowser控件(Silverlight内置HTML浏览器控件)
  8. 运营级IOS一键签名程序源码 支持app超级签名一键分发平台
  9. Git如何进行减少提交历史数量以及修改自己的commit中的邮箱
  10. Extjs 代码拾穗
  11. powershell 设置代理_WSL2中使用proxychains ng代理加速
  12. 三维重建笔记_SLAM简介
  13. EDA技术实用教程 | 复习二 | Verilog基本语法
  14. netty 百度网盘 密码
  15. excel熵值法计算权重_SPSSAU一众新功能上线:高级公式、综合得分一键计算
  16. xcel Home 数据透视表初级班(10118班)小结第二课时
  17. 重测序群体遗传进化分析之进化树构建
  18. 赠书 |“硅谷精神之父”凯文·凯利:5000 天后的 “AI” 世界
  19. java使用jol打印对象信息
  20. 我们的管理:部门管理

热门文章

  1. CodeIgniter学习笔记一:基本结构、控制器、视图、超级对象、数据库
  2. 电商顾客满意的五大决定因素
  3. 让193FW显示1440x900还真不容易
  4. 【博客】搭建个人博客边学边搭(一个晚上)
  5. mysql 历史版本下载
  6. (第一次)NODEJS学习笔记
  7. Spring AOP注解方式实现日志管理
  8. Celery简介及Docker测试环境搭建
  9. cordova降低版本10.0.0为8.1.2
  10. Ubuntu18.04 给整个目录及子目录赋权限