c 语言中的菱形继承,C++中的菱形继承深入分析
菱形继承
class Person
{
int _AA;
};
class Student:public Person
{
int _BB;
};
class Teacher :public Person
{
int _CC;
};
class Assistant :public Student, public Teacher
{
int _DD;
};
PS:
Assistant的对象中存在两份Person成员
菱形继承存在二义性和数据冗余
解决:
使用虚继承
首先不使用虚继承时:
#include
using namespace std;
class AA
{
public:
string _aa;
};
class BB :public AA
{
public:
int _bb;
};
class CC :public AA
{
public:
int _cc;
};
class DD :public BB, public CC
{
public:
int _dd;
};
int main()
{
DD d;
d.BB::_aa = 1;
d.CC::_aa = 2;
d._bb = 3;
d._cc = 4;
d._dd = 5;
cout << sizeof(d) << endl;
return 0;
}
菱形继承对象模型:
使用虚继承时:
#include
using namespace std;
class AA
{
public:
string _aa;
};
class BB :virtual public AA
{
public:
int _bb;
};
class CC :virtual public AA
{
public:
int _cc;
};
class DD :public BB, public CC
{
public:
int _dd;
};
int main()
{
DD d;
d.BB::_aa = 1;
d.CC::_aa = 2;
d._bb = 3;
d._cc = 4;
d._dd = 5;
cout << sizeof(d) << endl;
return 0;
}
菱形虚拟继承对象模型:
两个空格处地址相差为8,第一个空格处存放空格处位置到AA的偏移量为20,第二个空格处存放空格处位置到AA的偏移量为12,浪费两个空间存放偏移量,AA只需计算一次。
PS:
1.虚继承解决了在菱形继承体系里面子类对象包含多份父类对象的数据冗余&浪费空间的问题。
2.虚继承体系看起来好复杂,在实际应用我们通常不会定义如此复杂的继承体系。一般不到万不得已都不要定义菱形结构的虚继承体系结构,因为使用虚继承解决数据冗余问题也带来了性能上的损耗。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
c 语言中的菱形继承,C++中的菱形继承深入分析相关推荐
- 【转】继承过程中 父类子类的 字段方法 内存分配 (非java语言)
名人名言:思想好比火星:一颗火星会点燃另一颗火星.一个深思熟虑的教师和班主任,总是力求在集体中创造一种共同热爱科学和渴求知识的气氛,使智力兴趣成为一些线索,以其真挚的.复杂的关系--即思想的相互关系把 ...
- c++ map 析构函数_C++|类继承关系中的虚函数、虚析构函数、虚基类
在继承关系中,虚函数.虚析构函数.虚基类中使用的关键字virtual都是在告诉编译器,此处要进行特殊处理: 虚函数:函数重写时的要求编译器动态绑定来实现多多态 : 虚析构函数:当基类指针指向在堆内实现 ...
- java 继承 extends_java中的继承 (extends) 详解
继承(extends) 1. 父类与子类 父类也叫基类.超类 子类也叫派生类 在继承的而关系中,"子类就是一个父类".也就是说,子类可以被当做父类来看待.例如父类是员工,子类是 ...
- 在设计原则中,为什么反复强调组合要优于继承?
今日推荐21 款 yyds 的 IDEA插件这 56 个代码注释让我笑吐了注解+反射优雅的实现Excel导入导出(通用版)Fluent Mybatis 牛逼!Nginx 常用配置清单这玩意比Threa ...
- R语言ggplot2可视化移除数据中的NA值再可视化实战:消除图形中非常突出的NA柱状图、使用subset函数、使用drop_na函数
R语言ggplot2可视化移除数据中的NA值再可视化实战:消除图形中非常突出的NA柱状图.使用subset函数.使用drop_na函数 目录
- R语言使用edit函数在Rsudio中生成数据编辑器(在windows中生成编辑器)、在编辑器中输出需要的数据生成最终的dataframe
R语言使用edit函数在Rsudio中生成数据编辑器(在windows中生成编辑器).在编辑器中输出需要的数据生成最终的dataframe 目录
- R语言ggplot2可视化:计算dataframe中每个数据列缺失值的个数、使用堆叠的条形图(Stacked Barplot)可视化每个数据列的缺失值的情况(自定义堆叠条形图的形式)
R语言ggplot2可视化:计算dataframe中每个数据列缺失值的个数.使用堆叠的条形图(Stacked Barplot)可视化每个数据列的缺失值的情况(自定义堆叠条形图的形式) 目录
- R语言ggplot2可视化:为图像中的均值竖线、中位数竖线、 geom_vline添加图例(legend)
R语言ggplot2可视化:为图像中的均值竖线.中位数竖线. geom_vline添加图例(legend) 目录
- R语言ggplot2可视化添加希腊字母标签:图表题(title)中加入希腊字母、图中加入希腊字母标签
R语言ggplot2可视化添加希腊字母标签:图表题(title)中加入希腊字母.图中加入希腊字母标签 目录
最新文章
- java中无法推断类型参数_Java 10中的本地类型推断,或者如果它像鸭子一样嘎嘎叫...
- leetcode刷题——415. 字符串相加
- 改caffe 里面的contrsitve_loss
- 【收藏干货】axios配置大全
- Hibernate的单向N-1关联(一)
- Shell脚本:Linux Shell脚本学习指南(超详细)
- (PTA)java基础编程题汇总
- 花瓣网服务器维护一个月,花瓣网维护网站推荐-只需要这一个网站就够了
- SSIS变量如何获取当前的系统时间(字符串格式年月日)
- 金彩教育:详情页文案怎么写
- 计算机提示无法识别优盘,U盘插入电脑提示无法识别的解决方法
- NNDL 作业7:第五章课后题(1×1 卷积核 | CNN BP)
- 计算机关机界面卡住,电脑关机时卡在关机界面的解决方法
- 室内全景图数据集的设计及制作流程
- spring batch 3.0 scop job 问题记录
- 用户可以更方便高效的使用计算机,有了操作系统,用户可以更方便高效的使用计算机。...
- ios 裁剪框大小_iOS自定义裁剪图片比例尺寸,图片自动旋转解决办法
- 易灵思Ti60 FPGA专题(1)-器件和需求介绍
- 翻译Houdini官方文档:PDG/TOPs介绍
- ROS 重名问题解决