#include <cstdio>
#include<iostream>
using namespace std;
//基类A
class A{public:A(int a, int b);
public:void display();public:int m_a;int m_b;
};
A::A(int a, int b): m_a(a), m_b(b){}
void A::display(){printf("m_a=%d, m_b=%d\n", m_a, m_b);
}
//派生类B
class B: public A{public:B(int a, int b, int c);void display();public:int m_c;
};
B::B(int a, int b, int c): A(a, b), m_c(c){ }
void B::display(){printf("m_a=%d, m_b=%d, m_c=%d\n", m_a, m_b, m_c);
}
int main(){A obj_a(99, 10);B obj_b(84, 23, 95);cout<<"&obj_a.m_a="<<&obj_a.m_a<<"  &obj_a.m_b="<<&obj_a.m_b<<"  &obj_a="<<&obj_a<<endl;cout<<"&obj_b.m_a="<<&obj_b.m_a<<"  &obj_b.m_b="<<&obj_b.m_b<<"  &obj_b.m_c="<<&obj_b.m_c<<"  &obj_b="<<&obj_b<<endl;obj_a.display();obj_b.display();return 0;
}
&obj_a.m_a=0x7ffc9098d234  &obj_a.m_b=0x7ffc9098d238  &obj_a=0x7ffc9098d234
&obj_b.m_a=0x7ffc9098d23c  &obj_b.m_b=0x7ffc9098d240  &obj_b.m_c=0x7ffc9098d244  &obj_b=0x7ffc9098d23c
m_a=99, m_b=10
m_a=84, m_b=23, m_c=95

obj_a 是基类对象,obj_b 是派生类对象。假设 obj_a 的起始地址为 0X1000,那么它的内存分布如下图所示:
假设 obj_b 的起始地址为 0X1100,那么它的内存分布如下图所示:
可以发现,基类的成员变量排在前面,派生类的排在后面。

为了让大家理解更加透彻,我们不妨再由 B 类派生出一个 C 类:

#include <cstdio>
#include<iostream>
using namespace std;
//基类A
class A{public:A(int a, int b);
public:void display();public:int m_a;int m_b;
};
A::A(int a, int b): m_a(a), m_b(b){}
void A::display(){printf("m_a=%d, m_b=%d\n", m_a, m_b);
}
//派生类B
class B: public A{public:B(int a, int b, int c);void display();public:int m_c;
};
B::B(int a, int b, int c): A(a, b), m_c(c){ }
void B::display(){printf("m_a=%d, m_b=%d, m_c=%d\n", m_a, m_b, m_c);
}//声明并定义派生类C
class C: public B{public:C(char a, int b, int c, int d);
public:void display();
public:int m_d;
};
C::C(char a, int b, int c, int d): B(a, b, c), m_d(d){ }
void C::display(){printf("m_a=%d, m_b=%d, m_c=%d, m_d=%d\n", m_a, m_b, m_c, m_d);
}int main(){A obj_a(99, 10);B obj_b(84, 23, 95);cout<<"&obj_a.m_a="<<&obj_a.m_a<<"  &obj_a.m_b="<<&obj_a.m_b<<"  &obj_a="<<&obj_a<<endl;cout<<"&obj_b.m_a="<<&obj_b.m_a<<"  &obj_b.m_b="<<&obj_b.m_b<<"  &obj_b.m_c="<<&obj_b.m_c<<"  &obj_b="<<&obj_b<<endl;obj_a.display();C obj_c(84, 23, 95, 60);cout<<"&obj_c.m_a="<<&obj_c.m_a<<"  &obj_c.m_b="<<&obj_c.m_b<<"  &obj_c.m_c="<<&obj_c.m_c<<"  &obj_c.m_d="<<&obj_c.m_d<<"  &obj_c="<<&obj_c<<endl;obj_c.display();obj_b.display();return 0;
}

假设 obj_c 的起始地址为 0X1200,那么它的内存分布如下图所示:


成员变量按照派生的层级依次排列,新增成员变量始终在最后。

C++继承时的对象内存位置(一)相关推荐

  1. C++继承时的对象内存位置(一)有成员变量遮蔽时的内存分布

    #include <cstdio> #include<iostream> using namespace std; //基类A class A{public:A(int a, ...

  2. C++多继承时的对象内存模型

    #include <cstdio> #include <iostream> using namespace std; //基类A class A{ public:A(int a ...

  3. C++虚继承(二) --- C++ 对象的内存布局(上)(陈皓)

    C++ 对象的内存布局(上) 陈皓 http://blog.csdn.net/haoel 点击这里查看下篇>>> 前言 07年12月,我写了一篇<C++虚函数表解析>的文 ...

  4. lombok使用中出现继承关系的对象时,出现的问题及解决办法

    lombok使用中出现继承关系的对象时,出现的问题及解决办法 参考文章: (1)lombok使用中出现继承关系的对象时,出现的问题及解决办法 (2)https://www.cnblogs.com/h- ...

  5. C++对象内存布局--⑤GCC编译器--单个虚拟继承

    C++对象内存布局--⑤GCC编译器--单个虚拟继承 测试GNU的GCC编译器在处理虚拟继承上跟VS不同的地方.派生类的虚函数表跟虚基类表合并. //GCC编译器--单个虚拟继承.cpp //2010 ...

  6. C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中

    C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中 测试2:证明派生类的虚函数的地址跟第一基类的虚函数地址保存在同一张虚函数表中. 派生类有多少个拥有虚函数的基类,派生类对象就有多少 ...

  7. C++对象内存布局--④VS编译器--单个虚拟继承

    C++对象内存布局--④VS编译器--单个虚拟继承 在VS2005编译器下,证明单个虚拟继承的内存布局:无论有无虚函数,必然含有虚基类表指针.虚基类表中的内容为本类实例的偏移和基类实例的相对偏移值. ...

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

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

  9. C++对象内存模型学习

    本文原文出处为MSDN.如果你安装了MSDN,可以搜索到C++ Under the Hood.否则也可在网站上找到http://msdn.microsoft.com/archive/default.a ...

最新文章

  1. 刻意练习:LeetCode实战 -- 二叉树的后序遍历
  2. 外卖ERP管理系统(二)
  3. Automation Test in Maya Plugin Development
  4. linux远程连接硬件加速,linux – 没有X的硬件加速
  5. 非顺序控制结构的c语言语法是怎样的,流程控制语句:顺序结构和选择结构
  6. Python 入门级1
  7. html怎么更改手势手型,弹钢琴时纠正手型手势的正确方法
  8. iredmail开源邮件系统部署
  9. 在你的 Android App 中使用 Flutter | Google开发者大会
  10. linux 设置防火墙ip网段,网络防御-防火墙设置IP网段规则
  11. Purftpd的详细安装配置
  12. webpack配置时:Plugin/Preset files are not allowed to export objects, only functions.
  13. 蓝桥杯练习——摔手机测试次数
  14. 解决UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xca in position 0: invalid continuation byte
  15. BZOJ3711: [PA2014]Druzyny
  16. 双系统:Win10+Ubuntu(UEFI启动模式)
  17. 落谷P1008三连击(C++)
  18. C语言-定义和声明的区别
  19. 微信公众号之验证JS-SDK
  20. 计算机基础知识考试没过咋办,科目一考了五次都没过,我该怎么办?

热门文章

  1. 5.MATLAB路径管理
  2. 拉格朗日差值法----算法学习
  3. numpy meshgrid 和 mgrid 的两个简单实例和解析
  4. PowerPC中断系统简介(一)
  5. 使用Hexo+ github快速搭建自己的博客网站(一)
  6. 第十七章 Python网络编程
  7. nodejs连接mysql报connect ECONNREFUSED错误的解决方法
  8. 2D 游戏引擎 AlloyGameEngine
  9. 简单用数组模拟顺序栈(c++)
  10. JAVA中的break[标签]continue[标签]用法