面向对象:继承

本文探讨了C++中的继承机制,包括单继承、多继承(尤其是菱形继承带来的数据冗余和二义性问题),并通过虚拟继承解决这些问题。此外,文章还比较了继承与组合的优缺点,以及继承中函数重定义和赋值转换的规则。
摘要由CSDN通过智能技术生成


在这里插入图片描述


先赞后看,养成习惯!!!^ _ ^<3 ❤️ ❤️ ❤️
码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦!
所属专栏:C++进阶
在这里插入图片描述

一、什么叫继承?

继承就是子类继承父类的公有的和保护的成员,子类在C++中被称作派生类,父类也就是基类
细节如下图:

在这里插入图片描述
通过监视窗口可以看到son继承了farther的成员,并且son的改变也影响着farther,同时farther的改变也能影响son
在这里插入图片描述
如果将基类的成员变成被保护的话,那么只有派生类可以访问到,外面访问不到

二、单继承

下面的图示就是表示单继承的关系

在这里插入图片描述

三、多继承

3.1多继承的各种情况

3.1.1一般情况

在这里插入图片描述

3.1.1特殊情况(菱形继承)

在这里插入图片描述
在这里插入图片描述

编译器里面也用了菱形继承,但是在真正工程项目上面基本上用的很少,因为会引发一系列问题

四、菱形继承引发的问题

4.1 问题1:数据冗余

在这里插入图片描述
在everyone对象中person成员有两个

4.2 问题2:二义性(无法确定到底是访问哪个)

在这里插入图片描述
指定作用域的话就可以访问到,但是造成了数据冗余的问题,还是无法全部解决问题
在这里插入图片描述

五、虚拟继承解决菱形继承的问题

5.1虚拟继承是什么?

就是在类前面加一个virtual
在这里插入图片描述

5.2虚拟继承如何解决二义性和数据冗余?

如下图B与C对象分别有一个指针,这个指针是指向对象A的地址,可以找出A对象在B和C中成员变量的值, 其中D包含整个BAC(这里的D不仅仅只包含_d的值,图解有点问题)

在这里插入图片描述
在这里插入图片描述

六、继承和组合相对比

6.1继承具有高耦合性,低内聚(关联性强)

在这里插入图片描述

6.2组合具有低耦合高内聚的特性(关联性低)

在这里插入图片描述
在一般的项目工程中组合的用处比较多,继承由于高耦合不适用于一些场景,但是后面的多态需要用到它

七、继承中函数的重定义问题

子类在继承父类的成员函数时,如果函数名相同的话就会构成隐藏,也就是访问子类的成员函数时不会访问到继承的父类的成员函数,但是如果添加父类的作用域的话也是可以访问到的
如下图实例

在这里插入图片描述
在这里插入图片描述

八、继承中基类和派生类的赋值转换问题

8.1派生类可以赋值给基类,但是基类不能赋值给派生类

还是刚刚那个例子,A为父类,B为子类,这里出现了报错子类b无法赋值给a
在这里插入图片描述

8.2基类的指针可以指向派生类的地址,这叫做切割

在这里插入图片描述

在这里插入图片描述

评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙猫不是一只猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值