当前位置: 首页 > news >正文

C++--菱形继承

1.什么是菱形继承

        单继承:一个子类只有一个直接父类时称这个继承关系为单继承

                                

 

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

菱形继承的问题:菱形继承有数据冗余和二义性的问题,数据冗余是由于创建多个相同类型的数据,浪费空间,二义性是由于两个不同的类同时继承了一个相同的类



 

虚拟继承可以解决菱形继承的二义性和数据冗余的问题.需要注意的是,虚拟继承不要在其他地
方去使用,且在B,C处使用virtual关键字即可。

2.菱形虚拟继承原理

为了研究虚拟继承原理,我们给出了一个简化的菱形继承继承体系,再借助内存窗口观察对象成
员的模型。

 

class A
{
public:int _a;
};
// class B : public A
class B : virtual public A
{
public:int _b;
};
// class C : public A
class C : virtual public A
{
public:int _c;
};
class D : public B, public C
{
public:int _d;
};int main()
{D d;/*d._a = 1;B b;b._a = 0;B* ptr = &b;ptr->_a++;ptr = &d;ptr->_a++;*///cout << b._a << endl;/*d.B::_a = 10;d.C::_a = 11;cout << d.B::_a << endl;cout << d.C::_a << endl;*/B b;b._a = 10;C c;c._a = 11;cout << b._a << endl;cout << c._a << endl;return 0;
}

在菱形继承情况下:有菱形继承的二义性和数据冗余的问题。

 从上图中可以看出B中有一个·a,C中也有一个a,造成数据的二义性。

使用菱形继承:

这个数据为16进制的数据,为20和12,而20和12正好是B里面的指针减去A的指针和C里面的指针减去A的指针的大小,所以这两个数就是偏移量,这两个指针叫虚基表指针,这两个表叫虚基表。虚基表中存的偏移量。通过偏移量可以找到下面的A。所以使用虚拟继承可以解决数据冗余和二义性问题。

3.总结

 

http://www.lryc.cn/news/100002.html

相关文章:

  • Vue 3:玩一下web前端技术(二)
  • 自然语言处理14-基于文本向量和欧氏距离相似度的文本匹配,用于找到与查询语句最相似的文本
  • iOS开发-聊天emoji表情与自定义动图表情左右滑动控件
  • Mybatis plus 存储 List、Map
  • Electron 系统通知 Notification 实践指南
  • 配置代理——解决跨域问题(详解)
  • VScode 避免逗号、括号时自动补全
  • 【数学建模】时间序列分析
  • Spring使用注解进行对象装配(DI)
  • 数学建模-蒙特卡洛模拟
  • Pearson correlation皮尔逊相关性分析
  • P1036 [NOIP2002 普及组] 选数
  • css终极方案PostCSS
  • 代码随想录算法训练营第三天|417. 太平洋大西洋水流问题|24. 两两交换链表中的节点|19.删除链表的倒数第N个节点|面试题 02.07. 链表相交|
  • 【Java】Spring——创建Spring + 对Spring的存储 /读取对象操作
  • RTPSv2.2(中文版)
  • Django学习笔记-视图(views)的使用
  • 四姑娘山三日游
  • spinal HDL语法学习
  • GRE TAP的工作原理与5G工业物联网中的应用
  • NFT和数字藏品的安全方案解析
  • 第四篇-Miniconda3-CentOS7-安装
  • 高效率,38V最大输入单电感同步升/降稳压器SYV939C
  • mars3d绘制区域范围(面+边框)
  • HTML的表格应用
  • android的数据存储方式
  • 用C++编写一个MyString类
  • Linux C语言中access函数的用法
  • c# winform 子窗体关闭时主窗体执行指令
  • vue-simple-uploader的fileAdded方法不支持异步的解决办法,autoStart 设置