浅析C++中的is-a和has-a关系(公有继承、包含、私有继承)

派生类和基类之间的特俗关系是基于C++继承的底层模型的。
总所周知,C++具有三种继承:公有继承、私有继承、保护继承。

最常见的就是公有继承,它建立一种is-a的关系。
如何理解is-a呢?即派生类对象也是一个基类对象,可以对基类对象执行的任何操作,也可以对派生类对象执行。

举个栗子:
有一个水果Fruit类,可以保存水果的重量和热量;
香蕉是一种水果,所以可以从Fruit类派生出Banana类;
Banana类继承了父类的所有数据成员,因此,Banana对象将包含表示香蕉重量和热量的成员;
此外,Banana类可以添加专门用于香蕉的成员。
但是,Banana类不能删除基类的Fruit的属性。
因此Banana is a kind of Fruit,即我们所说的is-a关系。

class Banana:public Fruit
{
};

那么has-a关系呢?

同样举个栗子:
午餐可能包括水果,但是午餐并不是水果;
所以不能从Fruit公有派生出Lunch类;
在午餐中加入水果的正确方法是将其作为一种has-a关系。

那么如何实现has-a呢?
通常的是有两种方法:包含和私有继承。
所谓的包含就是将Fruit对象作为Lunch类的数据成员,即新的类包含一个类的对象。
所谓的私有继承就是class Lunch:private Fruit。

通过分析我们知道:
使用公有继承而已继承接口,也可能还有实现。获得接口是is-a关系的组成部分;
而使用包含,类可以获得实现,但不能获得接口。不继承接口是has-a关系的组成部分。

那么如何实现包含,如何实现私有继承,以及两种建立has-a关系的方法有何不同,将会在后续的博客中进行阐述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一苇渡江694

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

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

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

打赏作者

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

抵扣说明:

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

余额充值