———————————————综述与目录——————————————

讨论这个问题之前我们先明确类的结构,一个类的大概组成,下面的很多分类名词都是我个人杜撰,为的就是让读者看懂能够区分,下面分别分类:

目录

空类 不含任何成员变量,也不继承某个基类。
结构类 像C语言中结构体一样,要么只包含基本数据类型,要么是其他构造类型的嵌套,或者两者兼而有之。
派生类 有至少一个基类。
多态类 本身是一个派生类,且基类中有虚函数。

以上只是大概的分类,细分会在下面的情况里讨论,该文章仅当作为个人使用C++经验的总结,不作学习参考,因为归纳与分类这个事情,学会了自然通。

 ———————————————进入正题——————————————

 空类:

空类不空,虽然不含任何成员,但必须用一个占位符描述,站在逻辑的角度来考虑,因为其存在的合法性,必须在语法上保证正确性,如果构建一个空类的数组。试想没有大小类构成的数组,又怎么去偏移地址来寻找下一个元素呢!

结构类:

其内存分布与C语言中的结构体没有任何区别。

派生类:

派生表现的是一种继承关系。派生类中一定有父类的共性,也有自己的个性。表现出的是一种继承与发展的关系。刚从C语言转到C++时转不过弯来常常自问为什么要继承呢,都写到一个类里不行吗?后来明白如果没有继承便少了一种代码重用方式。关于派生类的内存对齐方式,我前面的随笔中有写:https://www.cnblogs.com/wangkeqin/p/12861852.html

要讨论派生类的内存分段,就要从赋值兼容说起,这里先明确定义:赋值兼容规则是指,在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。

 

赋值兼容细化

1 派生类的对象可以赋值给基类对象。
2 派生类的对象可以初始化基类的引用。
3 派生类对象的地址可以赋给指向基类的指针。

派生类转化成基类是一种类型安全的转化,对象赋值不必讨论。主要是看指针和引用。

#include <iostream>

using namespace std;

class P1
{
public:
P1():m_p1(0){
cout<<"P1():"<<this<<endl;
}
~P1(){
cout<<"~P1():"<<this<<endl;
}
void* PrintP1(){
cout<<"P1_Prinit:"<<this<<endl;
return this;
}
protected:
int m_p1;
}; class P2
{
public:
P2():m_p2(0){
cout<<"P2():"<<this<<endl;
}
~P2(){
cout<<"~P2():"<<this<<endl;
}
void* PrintP2(){
cout<<"P1_Prinit:"<<this<<endl;
return this;
}
protected:
int m_p2;
}; class Son:public P1,public P2
{
public:
Son():m_s1(0){
cout<<"Son():"<<this<<endl;
}
~Son(){}
void* PrintSon()
{
cout<<"Son_Print:"<<this<<endl;
return this;
} protected:
int m_s1;
}; int main()
{
cout<<"---------create a son instance--------------"<<endl;
Son s1; cout<<"-----------pointer compare------------------"<<endl;
P1 * p1Son = &s1;
P2 * p2Son = &s1;
if((long long)p1Son == (long long)p2Son)
cout<<"p1Son==p2Son"<<endl;
else
cout<<"p1Son:"<<p1Son<<"----"<<"p2Son:"<<p2Son<<endl;
cout<<"--------reference pointer compare-----------"<<endl;
P1 & r1Son = s1;
P2 & r2Son = s1; if((long long)(&r1Son) == (long long)(&r2Son))
cout<<"r1Son==r2Son"<<endl;
else
cout<<"pr1Son:"<<(&r1Son)<<"----"<<"pr2Son:"<<(&r2Son)<<endl; return 0;
}

运行结果:

不同的基类指针指向同一个派生类对象,其指针的值不同,也就是说不同基类指针在接受派生类对象赋值时,所指向的派生类的“段”是不一样的。基类引用派生类对象同理。

 多态类:

多态类的讨论实际上就是虚函数表的继承与合并问题,情况比较多,放在这篇文章中讨论:https://www.cnblogs.com/wangkeqin/p/12887739.html

C++继承体系中的内存分段的更多相关文章

  1. C++继承体系中的内存对齐

    本篇随笔讨论一个比较冷门的知识,继承结构中内存对齐的问题,如今内存越来越大也越来越便宜,大部分人都已经不再关注内存对齐的问题了.但是作为一个有追求的技术人员,实现功能永远都是最基本的要求,把代码优化到 ...

  2. C++ 继承体系中的名称覆盖

    首先一个简单的样例: int x; int f() { double x; cin >> x; return x; } 在上述代码中.函数f的局部变量x掩盖了全局变量x.这得从 " ...

  3. 关于Java继承体系中this的表示关系

    Java的继承体系中,因为有重写的概念,所以说this在子父类之间的调用到底是谁的方法,或者成员属性,的问题是一个值得思考的问题; 先说结论:如果在测试类中调用的是子父类同名的成员属性,这个this. ...

  4. Java继承体系中this的表示关系

    在继承关系下,父类中的this关键字并不总是表示父类中的变量和方法.this关键字的四种用法如前文所述,列举如下. 1) this(paras…); 访问其他的构造方法 2) this.xxx; 访问 ...

  5. C++中虚基类在派生类中的内存布局

    今天重温C++的知识,当看到虚基类这点的时候,那时候也没有太过追究,就是知道虚基类是消除了类继承之间的二义性问题而已,可是很是好奇,它是怎么消除的,内存布局是怎么分配的呢?于是就深入研究了一下,具体的 ...

  6. C++学习笔记----4.5 C++继承时的对象内存模型

    推荐阅读:http://blog.csdn.net/randyjiawenjie/article/details/6693337 最近研究了一下,C++继承的内存对象模型.主要是读了读http://b ...

  7. 从基层容器类看万变不离其宗的JAVA继承体系

    以容器类为例子,可以观一叶而知秋,看看以前的前辈们是如何处理各种面向对象思想下的继承体系的.读的源代码越多,就越要总结这个继承关系否则读的多也忘得快. 首先摆上一张图片: 看到这张图很多人就慌了,难道 ...

  8. 使用RTTI为继承体系编写”==”运算符

    转载请注明出处:http://www.cnblogs.com/inevermore/p/4012079.html   RTTI,指的是运行时类型识别技术.   先看一个貌似无关的问题:   为继承体系 ...

  9. C++对象模型——继承体系下的对象构造(第五章)

    5.2 继承体系下的对象构造 当定义一个object例如以下: T object; 时,实际上会发生什么事情呢?假设T有一个constructor(不论是由user提供或是由编译器合成),它会被调用. ...

随机推荐

  1. JDK安装与环境搭建.

    卸载JDK 1.删除Java安装目录 2.删除Java Home 3.删除path下Java的目录 4.打开cmd命令输入java-version 出现''不是内部或外部命令,也不是可运行的程序 或批 ...

  2. react应用(基于react脚手架)

    使用create-react-app创建react应用 react脚手架 1) xxx脚手架: 用来帮助程序员快速创建一个基于xxx库的模板项目 a. 包含了所有需要的配置 b. 指定好了所有的依赖 ...

  3. 拿来-util工具函数

    记录一些写的好的工具函数.以便学习和项目中直接拿来使用. 判断值是否相等:使用于任何数据类型:基本数据类型和复杂深层次对象 function deepEqual (a, b) { if (a === ...

  4. Leetcode:面试题68 - II. 二叉树的最近公共祖先

    Leetcode:面试题68 - II. 二叉树的最近公共祖先 Leetcode:面试题68 - II. 二叉树的最近公共祖先 Talk is cheap . Show me the code . / ...

  5. 前端基础css(三)

    HTML:用于显示页面的内容 CSS:用于以什么样的形式(样式)去显示 一. 选择器 [1] 标签/元素选择器 (整个页面的所有的相同的标签都显示统一的样式) h1{ font-size: 20px; ...

  6. TheadLocal与synchronized

    深入比较TheadLocal模式与synchronized关键字 ThreadLocal模式synchronized关键字都用于处理多线程并发访问变量的问题,只是二者处理问题的角度和思路不同. 1)T ...

  7. [考试总结]noip模拟14

    咕掉了好长时间,现在终于回来了.. 这次考试炸裂得很完蛋,直接分数上天. \(T1\) 本来想打一个记忆化搜索,然而老是通过不了样例,然后就挂了,只剩下了垃圾的 \(30pts\) 部分分数. 然而到 ...

  8. Python输出格式化

    参考链接:https://m.jb51.net/article/33631.htm 要求:以固定长度在中间输出某字符串,剩余部分用其他符号补齐.如:"Hello World"  - ...

  9. jquery.autocomplete 使用解析

    页面引用 <script type="text/javascript" src="${base}/autocom/jquery-1.8.2.min.js" ...

  10. 电脑软件安装过程文档.BA

    MD 01-打印并阅读-电脑软件安装过程文档.BAT-即此批处理脚本文档MD 02-阅读-电脑软件安装经验教训文档.DOCX-MD 03-制作-杏雨梨云USB维护系统2019中秋版之国庆更新-可启动U ...