菱形继承

  • 单继承:一个子类只有一个直接父类时称这个继承关系为单继承
  • 多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承

  • 菱形继承:菱形继承是多继承的一种特殊情况。

来看看下面这段菱形继承的代码有什么问题呢?

#include <iostream>class A
{
public:int a;
};
class A1 : public A
{
public:int a1;
};
class A2 : public A
{
public:int a2;
};
class B : public A1, public A2
{
public:int b;
};int main()
{B b;return 0;
}

这样看好像没有什么问题,我们打开监视窗口发现:

发现b对象中含有两份a,这是因为A1和A2分别继承了A的成员,它们各自都有一份a,B继承了A1A2,所以b对象中就有了两份a,这就造成了数据的冗余性

若要访问成员a,要怎么访问呢? 看看下面的测试代码:

int main()
{B b;// 这样无法明确知道访问的是哪一个,出现了新的问题:二义性b.a = 1;// 显示指定访问哪个父类的成员解决了二义性的问题,但是数据冗余问题无法解决b.A1::a = 1;b.A2::a = 2;return 0;
}

总结:菱形继承有数据冗余和二义性的问题!

虚拟继承

虚拟继承可以解决菱形继承的二义性和数据冗余的问题。

上面的关系中,A1和A2继承A时就可以使用虚拟继承,就可以解决这些问题。

class A
{
public:int a;
};
class A1 : virtual public A   //虚拟继承
{
public:int a1;
};
class A2 : virtual public A   //虚拟继承
{
public:int a2;
};
class B : public A1, public A2
{
public:int b;
};

注意:虚拟继承不要在其他地方去使用!

到底虚拟继承解决数据冗余和二义性的原理是什么呢?

给出下面的测试代码来看看:

B b;
b.A1::a = 1;
b.A2::a = 2;
b.a1 = 3;
b.a2 = 4;
b.b = 5;
  • 来看看菱形继承下的内存:

这里可以看到数据冗余。

  • 在看看菱形虚拟继承下的内存:

从内存 1 中可以看到:b对象中 将A放到了最下面,A同时又属于A1和A2,那A1和A2如何找到公共的A呢?

我们又看到内存1中A1和A2中有两个地址(指针),打开内存2查看这个地址发现:它指向一张表,表中第二个元素刚好为A1到A的偏移量。

所以得出:通过了A1和A2的两个指针,各自指向的一张表,这个表叫虚基表,这两个指针叫虚基表指针。虚基表中存的偏移量。通过偏移量可以找到下面的A。

一张图总结菱形虚拟继承:

菱形继承与菱形虚拟继承相关推荐

  1. C++继承以及菱形继承

    C++面向对象--继承 问题的引出 假如我们需要给某个高校制作一款人员信息管理系统,学习过C++之后我们知道可以给每个职业设置一个class,到每个个体的时候再具体实例化出一个对象就行了,假如该高校的 ...

  2. C++---虚拟继承---虚基表的产生

    为什么会有虚拟继承 在C++中由于有了多继承的关系,所以会产生一些特殊的继承方式. 例如:菱形继承 class A {public:int _a; }; class B:public A {publi ...

  3. C++随笔——虚拟继承

    虚拟继承 C++使用虚拟继承(Virtual Inheritance),使得派生类如果继承基类多次,但只有一份基类的拷贝在派生类对象中. 虚拟继承的语法: class 派生类: virtual 基类1 ...

  4. 关于C++中的虚拟继承的一些总结

    1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念.虚拟基类是为解决多重继承而出现的.如:类D继承自类B1.B2,而类B1.B2都继承自类A,因此在类D中两次出现类A中的变量和函数.为了节省内存 ...

  5. c++的虚拟继承 的一些思考吧

    虚拟继承是多重继承中特有的概念.虚拟基类是为解决多重继承而出现的.如:类D继承自类B1.B2,而类B1.B2都继承自类A,因此在类D中两次出现类A中的变量和函数.为了节省内存空间,可以将B1.B2对A ...

  6. 内存首地址为1000h_C++虚继承,菱形继承,内存分布

    前言 在叙述C++虚继承之前,我先给大家抛出一个问题.例如现在有4个类,分别是class A, class B, class C, class D.它们的关系如下图. 如上如所示,class B和cl ...

  7. 8-5:C++继承之多继承,菱形继承,虚继承,虚基表,继承和组合

    文章目录 一:菱形继承与菱形虚拟继承 (1)多继承 (2)菱形继承 (3)虚继承 A:如何解决 B:解决原理 二:继承总结 (1)继承缺陷 (2)继承与组合 一:菱形继承与菱形虚拟继承 (1)多继承 ...

  8. c++中的继承--3(多继承问题,菱形继承)

    继承中的多继承 #include<iostream>using namespace std;class Base1 { public:Base1(){m_A = 10;} public:i ...

  9. python的继承用法_python之继承中组合用法与菱形继承关系查找法

    1.什么是组合 组合就是一个类的对象具备某一属性,该属性的值是指向另外外一个类的对象 2.为什么用组合 组合也是用来解决类与类之间代码冗余问题 3.用法 class Course:           ...

最新文章

  1. 20165206 2017-2018-2 《Java程序设计》第三周学习总结
  2. 单例模式中,你不知道的事~~
  3. BFPRT 算法 (TOP-K 问题)——本质就是在利用分组中位数的中位数来找到较快排更合适的pivot元素...
  4. Eclipse相关问题总结
  5. hystrix之熔断
  6. 在BAE上搭建python,django环境小记
  7. 如何处理Docker错误消息:please add——insecure-registry
  8. Just For Fun:闲来无事,C语言+GTK生成mnist数据集的图形用户界面GUI
  9. 【Vue2.0】—组件(十一)
  10. CAD制图系列之中心线画法
  11. 山西计算机应用基本技能,山西应用科技学院计算机应用技术专业课程介绍/专业代码-卧龙指南...
  12. 并查集(2)-按秩合并和路径压缩
  13. 盘点电商大战背后的技术力量支撑
  14. 对Librehash海洋协议审查的回应
  15. MyEclipse配色
  16. flutter插件开发(一)
  17. 【iOS】AFNetworking
  18. 指令集架构、微架构、处理器架构、CPU架构、内核
  19. 2019牛客多校 第七场 B Irreducible Polynomial 多项式因式分解判断
  20. 一文带您快速了解工业交换机

热门文章

  1. python 对excel文件进行分词并进行词频统计_教你背单词 | 利用python分析考研英语阅读并生成词频降序表...
  2. classes是什么意思怎么读_KY啥意思?托马仕空品教你怎么读空气
  3. C语言引用文件空格和换行,关于文件操作,碰到空格就换行
  4. 正则表达式的深入理解
  5. usg2130 虚拟服务器,usg2130防火墙怎么样设置
  6. zedgraph支持游标吗_经典格斗游戏中的隐藏人物,当年在游戏厅你能选出来吗
  7. python 还原九宫格图片_用Python做一个好玩的朋友圈九宫格抽奖
  8. 接受许可协议 将禁用_知识产权小知识|知识产权许可
  9. mysql二维数组vb_VBA链接MYSQL的帮助类
  10. gitlab修改ip为url