9.2 继承:基类和派生类
一个类的对象经常会是另一个类的对象。例如,矩形当然是四边形(正方形、平行四边形和梯形也是这样),因此可以说矩形类 Rectangle 是从四边形类 Quadrilateral 继承而来的。在本例中,类 Quadrilateral 叫做基类,类 Rectangle 称为派生类。矩形是四边形的一种特殊类型,但是要说四边形是矩形则是不正确的。图 9.1 示例了几个简单的继承例子。
基类 | 派生类 |
---|---|
student | GraduateStudent |
UndergraduateStudent | |
Shape | Circle |
Triangle | |
Rectangle | |
Loan | CarLoan |
HomeIpprovementLoan | |
MoregageLoan | |
Employee | FacultyMember |
StaffMember | |
Account | CheckingAccount |
SavingsAccount |
图9.1 几个简单的继承例子
其他的面向对象程序设计语言使用了不同的术语。例如,在继承方面,smslltalk语言把基类类称为超类,派生类叫做子类。
因为由继承而产生的派生类通常比基类大,所以超类和子类这样的术语似乎是不合适的,本书没有使用这些术语。由于派生类对象可以看成基类的对象,因此基类有更多相关对象,而派生类的相关对象更少,因此可以把基类理解为“超类”,派生类理解为 子类。
继承形成了树状层次结构,基类和它的派生类构成了一种层次关系。一个类可以单独存在,但是当利用继承机制使用该类时,该类就成为给其他类提供属性和行为的基类,或者成为继承其他类的属性和行为的派生类。
下面是一个简单的继承层次结构。一个典型的大学社区有成千上万个人,他们是社区的成员。这些人由雇员(employee)和学生(student)组成。雇员又分为学院成员(faculty)和职员(staff),学院成员既可能是校长和系主任等等的管理者(administrator),也可能是教员(teacher)。这种关系构成的继承层次结构如图9.2所示。注意有些行政人员也任了课,因此我们用多重继承构成AdministratorTeacher类。由于学生常常在学校打工,职工也常常去修课,因此还可以用多重继承构成EmployeeStudent类。
图 9.2 大学社区成员的继承层次结构
另外一个实际存在的继承层次结构是像图 9.3 那样的 shape 层次结构。初次学习面向对象程序设计的学生都认为现实世界中存在着大量具有层次结构的实例,也正因为如此,这些学生从来没有认真思考过现实世界中的这种层次结构是如何分门别类的,所以应该在这方面好好思考一下。
图 9.3 类 shape 的部分层次结构
为了说明类 CommissionWorker 是从类 Employee 派生而来的,类 CommissionWorker 通常要作如下形式的定义;
class CommissionWorker:public Employee{
上述继承方法称为 public 继承(public inheritance),这种类型的继承是最常用的。本章还要讨论 private 继承(privateinheritane)和 protected 继承(protectedinheritance)。对于 public 继承来说,基类的 public 成员和 protected 成员可以分别作为派生类的 public 成员和 protected 成员而被继承。
用类似的方法处理基类对象和派生类对象是可能的。基类的属性和行为表述了基类对象及派生类对象的共性。从基类 public 派生出来的所有对象都可以作为基类对象处理。我们将研究很多例子。在这些例子中,我们可以利用这种关系很容易地设计程序,而非面向对象的语言(如 C语言)就做不到这一点。