在上一章中,我们讨论了对象组合,其中复杂的类由更简单的类和类型构成。对象组合非常适合构建与其部分具有“has-a”关系的新对象。然而,对象组合只是 C++ 允许您构建复杂类的两种主要方式之一。第二种方式是通过继承,它模拟了两个对象之间的“is-a”关系。
与对象组合(通过组合和连接其他对象来创建新对象)不同,继承涉及通过直接获取其他对象的属性和行为,然后对其进行扩展或专门化来创建新对象。与对象组合一样,继承在现实生活中无处不在。当你受孕时,你继承了父母的基因,并从他们那里获得了身体属性——但随后你又增添了自己的个性。科技产品(计算机、手机等)从其前辈那里继承了功能(通常用于向后兼容)。例如,英特尔奔腾处理器继承了英特尔 486 处理器定义的许多功能,而 486 处理器本身又继承了早期处理器的功能。C++ 继承了 C(其所基于的语言)的许多功能,而 C 又继承了其之前编程语言的许多功能。
考虑苹果和香蕉。尽管苹果和香蕉是不同的水果,但它们共同的特点是它们是水果。因为苹果和香蕉是水果,所以简单的逻辑告诉我们,任何关于水果的真理也适用于苹果和香蕉。例如,所有水果都有名称、颜色和大小。因此,苹果和香蕉也有名称、颜色和大小。我们可以说苹果和香蕉继承(获得)了水果的所有属性,因为它们是水果。我们还知道水果会经历一个成熟过程,使其变得可食用。因为苹果和香蕉是水果,我们也知道苹果和香蕉将继承成熟的行为。
用图表表示,苹果、香蕉和水果之间的关系可能如下所示
此图定义了一个层次结构。
层次结构
层次结构是显示各种对象如何关联的图表。大多数层次结构要么显示随时间的进展(386 -> 486 -> 奔腾),要么以从一般到具体的顺序对事物进行分类(水果 -> 苹果 -> 蜜脆)。如果你学过生物学,著名的域、界、门、纲、目、科、属和种的排序就定义了一个层次结构(从一般到具体)。
这是另一个层次结构的例子:正方形是矩形,矩形是四边形,四边形是形状。直角三角形是三角形,三角形也是形状。用层次结构图表示,它将如下所示
此图从一般(顶部)到具体(底部),层次结构中的每个项目都继承了其上方项目的属性和行为。
展望未来
在本章中,我们将探讨 C++ 中继承工作原理的基础知识。
下一章,我们将探讨继承如何通过虚函数实现多态性(面向对象编程的一大流行词)。
随着我们的进展,我们还将讨论继承的关键优势以及一些缺点。