C++多继承之菱形继承原理及解决方法

article/2024/4/13 14:49:56

目录

1.单继承和多继承

2.菱形继承

3.虚继承解决菱形继承

3.1使用方法

3.2虚继承原理

4.继承和组合


1.单继承和多继承

一个子类只有一个父类称为单继承

一个子类有多个父类称为多继承

2.菱形继承

菱形继承是多继承的一种复杂的情况

这里会出现一个问题,Assistant这个类中继承了两个Person类,造成了数据的冗余和二义性

例:

可以通过指定类域解决但是数据的冗余没有解决

3.虚继承解决菱形继承

3.1使用方法

虚继承可以在person被teacher和student继承时使用

在前面加个virtual

3.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.B::_a = 1;d.C::_a = 2;d._b = 3;d._c = 4;d._d = 5;return 0;
}

不加virtual时候看内存窗口很明显D对象中有两个a对象,有数据冗余。

加virtual之后对象A被放在了最底端,之前存放A的位置变成了一个地址。

这个地址指向基虚表,叫做基虚表指针,基虚表中存的时偏移量,通过偏移量可以找到A。

0x01 0F FD A4 + 0x00 00 00 14 = 0x 01 0F FD B8 正好是A的位置。

4.继承和组合

继承是is-a的关系,就是每一个派生类都是一个基类。

组合是has-a的关系,没事派生类都有一个基类

这就是组和

继承是白箱复用,对基类内部可见,一定程度破坏了封装,耦合度高。

组和是黑箱复用,对基类内部不可见,没有破坏封装,耦合度低。

组合比继承的可维护性更高,能用组合的地方就用组合。


http://www.ngui.cc/article/show-1919222.html

相关文章

131.乐理基础-快速识别音程(一)

上一个内容:130.乐理基础-倍增音程、倍减音程-CSDN博客 上一个内容里练习的答案: 开始不用数音数就可以辨别音程的方法,首先是不含升降号记号的两个音(两个白键)该怎样判断 方法的核心,就是音名中e-f和b-…

2.25基础会计学

资本公积是指由股东投入、但不能构成“股本”或“实收资本”的资金部分。 盈余公积是指公司按照规定从净利润中提取的各种积累资金。 所以区别在于盈余公积来自净利润。 借贷其实就是钱从哪来和到哪去的问题,来源是贷,流向是借。比如购入9w原材料&…

cad技巧

cad技巧 直线,斜线 移动,偏移,复制 圆,椭圆,圆弧 打断,延伸 线型比例,圆角,分解,文字编辑 矩形,合并,多段线,样条曲线 倒角&#xff…

【Elasticsearch专栏 16】深入探索:Elasticsearch的Master选举机制及其影响因素分析

Elasticsearch,作为当今最流行的开源搜索和分析引擎,以其分布式、可扩展和高可用的特性赢得了广大开发者的青睐。在Elasticsearch的分布式架构中,集群的稳健性和高可用性很大程度上依赖于其Master节点的选举机制。本文将深入剖析Elasticsearc…

Seata分布式事务实战AT模式

目录 分布式事务简介 典型的分布式事务应用场景 两阶段提交协议(2PC) 2PC存在的问题 什么是Seata? Seata的三大角色 Seata AT模式的设计思路 一阶段 二阶段 Seata快速开始 Seata Server(TC)环境搭建 db存储模式Nacos(注册&配…

[力扣 Hot100]Day35 LRU 缓存

题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否…

分享:如何做好Temu跨境电商项目的几点方法

Temu跨境电商项目作为中国电商巨头拼多多旗下的新兴跨境电商平台,近年来发展迅速,吸引了大量国内卖家参与。然而,由于跨境电商的复杂性和竞争激烈,如何在Temu平台上成功运营,实现良好的销售业绩,成为许多卖…

【Pytorch深度学习开发实践学习】B站刘二大人课程笔记整理lecture10 Basic_CNN

【Pytorch深度学习开发实践学习】B站刘二大人课程笔记整理lecture10 Basic_CNN 部分课件内容: 代码: import torch from torchvision import datasets, transforms from torch.utils.data import DataLoader import torch.nn as nn import torch.nn.f…

2024“薪”风口、学习鸿蒙开发就业钱景如何?

随着华为的鸿蒙系统从诞生之初就备受关注,对于那些对鸿蒙开发感兴趣并希望在这一领域寻找职业发展的人来说,这是一个非常重要的问题。 那么,2024年学鸿蒙开发的就业前景如何呢? 一、彻底摆脱“安卓套壳”! HarmonyO…

最短路径算法总结(Dijkstra、Bellman-ford、SPFA和Floyd)

在最短路径算法中,常用的有Dijkstra、Bellman-ford、spfa、Floyd这四大算法 Dijkstra:迪克斯特拉算法Bellman-ford:贝尔曼-福特算法SPFA:Shortest Path Faster Algorithm算法Floyd:弗洛伊德算法 四大算法介绍 简介 …