浅析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关系的方法有何不同,将会在后续的博客中进行阐述。

你可能感兴趣的:(C++)