C++ Primer Plus读书笔记—— 13.2 继承:is-a关系

这部分内容和c++本身并无太大关系。主要探讨了面向对象设计的几种模式。

is-a

往往用继承表达这种关系,派生类继承基类的所有特性。
这种关系往往表达成is-a-kind-of,也就是子类的对象往往是一种父类的对象。
举个例子,苹果是一种水果。

has-a

如果说一种对象包含了一整个其他的对象,或者说一种对象由其他几种对象组成。
这个时候并不适合用继承(派生)来表达这种关系,而是适合使用组合
也就是说,应该将这种对象作为另一种数据成员。
比如,午餐由水果、蔬菜、肉构成。

use-a

有的时候,一个对象可以使用另一种对象,或者说,一个对象可以操控另一个对象。
这个时候又显然不是上面的has-a关系——也就说两者之间并没有包含被包含的关系。
这个往往使用友元来实现。比如将一个类的成员函数作为另一个类的友元函数。
比如,计算机可以操控打印机去打印东西(但不能说打印机组成计算机的一部分)。

is-implemented-as-a

在数据结构中,有这样的问题——使用数组还是链表实现一个线性表。
这个时候上面三种关系都不太适合。
这个时候,应该这样处理比较妥当,将底层的实现方式作为类的私有成员属性。
比如,将一个可变长的数组类作为一个栈的私有成员对象。

is-like-a

书上的例子是——人们常常说律师就像鲨鱼一样。这种情况表现出来的关系最为复杂,可以采取方案比较多。
一种方案是,提取这两种类的公共特征写一个抽象基类,然后分别拓展这个抽象基类得到具体的类。

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/108249261