在前一章中,我们探讨了对象组合(object composition):通过将较简单的类与类型加以组合来构建复杂的类。对象组合非常适合描述“有一个”(has-a)关系的对象构建场景。然而,C++ 提供两种主要方式来构造复杂类,对象组合只是其中之一。第二种方式便是继承(inheritance),它刻画的是“是一个”(is-a)关系。
与对象组合——通过连接、组合其他对象来创建新对象——不同,继承允许新对象直接获得已有对象的属性与行为,并在此基础上进行扩展或特化。和对象组合一样,继承在现实世界中无处不在。受孕之时,你继承了父母的基因,从而获得了他们的许多生理特征;随后,你又在此基础上发展出独特的个性。技术产品(计算机、手机等)亦常从前代产品中继承功能(通常出于向后兼容的目的)。例如,Intel Pentium 处理器继承了 Intel 486 处理器定义的诸多特性,而 486 又继承了更早处理器的特性。C++ 基于 C 语言,因此继承了 C 的诸多特性;而 C 本身又继承了先前编程语言的许多特性。
以苹果和香蕉为例。尽管二者是不同种类的水果,但它们共同具有“水果”这一属性。既然苹果和香蕉都是水果,那么根据简单逻辑,凡适用于水果的命题亦适用于苹果和香蕉。例如,所有水果都有名称、颜色和大小,因此苹果和香蕉亦具备名称、颜色和大小。我们可以说,苹果和香蕉“继承”(获得)了水果的全部属性,因为它们本身就是水果。我们还知道,水果会经历一个成熟过程,从而变得可食用。由于苹果和香蕉是水果,它们也自然继承了“成熟”这一行为。
若用图示表示苹果、香蕉与水果之间的关系,大致如下:
该图展示了一种层级结构(hierarchy)。
层级结构(Hierarchies)
层级结构是一种用来描述各类对象之间关系的图示。多数层级结构要么显示随时间演进的序列(386 → 486 → Pentium),要么以“由一般到特殊”的方式对事物进行分类(水果 → 苹果 → Honeycrisp)。如果你学过生物学,著名的“域、界、门、纲、目、科、属、种”分类法即是一种由一般到特殊的层级结构。
再看另一个例子:正方形是一种矩形,矩形是一种四边形,四边形是一种形状;直角三角形是一种三角形,而三角形也是一种形状。若绘成层级图,如下所示:
该图自上而下由一般到特殊,每一层都继承上一层所具有的属性与行为。
前瞻
本章将探讨 C++ 中继承的基本工作原理。
下一章,我们将讨论继承如何通过虚函数机制实现多态(polymorphism)——面向对象编程的重要术语之一。
随着学习的深入,我们还将分析继承带来的关键优势以及潜在弊端。