文档介绍:第八章继承与多态
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生新的类,称派生类,即从原有类派生出来的新类。派生类不是简单地继承基础类的特性,它可以调整部分成员的特性,也可以增加一些新成员。在VC++的MFC编程中,有最典型的继承与派生:由一个基类一层一层派生出近二百个大多数MFC的类。继承呈现了面向对象程序设计的层次结构。
多态性(polymorphism)也是面向对象程序设计的标志性特征。多态性是考虑在不同层次的类中,以及在同一类中,同名的成员函数之间的关系问题。这个问题放在本章的后半部分讲解,但实际上早已开始应用:算术运算中不同类型数(整型、浮点等)的混合运算,就是一个典型的多态性应用。而函数的重载,运算符的重载,都属于多态性中的编译时的多态性。本章要讲解的是运行时的多态性,这是以虚基类为基础的多态性。
面向对象的程序设计是对人类思维和现实世界的模拟。人们认识世界总是从已认识的部分推广开来,去认识未知的部分。继承体现了由简单到复杂的认识过程,多态体现了类推和比喻的思想方法。
继承与派生的概念
层次概念是计算机的重要概念。对类(class)分层,提供类型/子类型的关系,这是通过继承(inheritance)的机制获得的。C++通过类派生(class derivation)的机制来支持继承。被继承的类型称为基类(base class)或超类(superclass),而新产生的类为派生类(derived class)或子类(subclass)。基类和派生类的集合称作类继承层次结构(hierarchy)。更进一步,如果基类和派生类共享相同的公有接口,则派生类被称作类的子类型(subtype)。
继承机制体现了现实世界的层次结构。例如学校的在册人员可分为两大类:学生和教职工。学生可分为本科生和研究生,教职工可分为教师、行政人员和工人。对在册人员管理的程序都要存储这些人员的身份证号、姓名、学校编号、性别、年龄、通信方式、家庭住址、家庭成员、社会关系和个人简历等等基本信息,还要有取得(查找)这些信息的操作方法。作为学生,还要存储应学课程(必修,选修)及学分、已学课程及成绩和学分、奖励和处罚的情况,还要有学籍管理、奖优惩劣的功能。对本科生还有毕业设计,对研究生有研究课题。作为教职工还要存储工资级别、当月薪水和工作业绩,当然还包括各种操作(函数):如计薪方法,业绩统计规则,升级的规定。但这操作方法对教师(不坐班),对行政人员(坐班),对工人都有不同。这样我们可以看到不同人员有共性也有自己的个性,或者说要处理的数据和操作的方法有相同的地方,也有不同的地方。解决方法有两种:一种是对不同类型的人员采用完全独立的管理方法;另一种是首先作统一的基本描述和管理,再针对大类(学生与教职工)的差异作进一步的管理,最后再对具体类别(本科生、研究生、教师、行政人员和工人)作个性管理。对应于面向对象的程序设计,前者是为具体类别人员各自独立设计一个类,而后者是为所有人员设计一个基类,而为两大类派生出两个派生类(学生类和教职工类),再在这两个派生类的基础上再派生出新类(本科生类,研究生类,教师类,行政人员类和工人类)。应该说后面一种方法更好,它反映了事物之间的联系,事物的共性与个性之间的关系。而前者把事物完全隔离开了。从工作量上看,也是后者更优,工作量少,重复的部分可以从基类继承,不需要单独编程。
类的派生与继承
由基类派生出派生类的定义的一般形式为
class 派生类名:访问限定符基类名1《,访问限定符基类名2,……,访问限定符基类名n》
{
《《private: 》
成员表1;》//派生类增加或替代的私有成员
《public:
成员表2;》//派生类增加或替代的公有成员
《protected:
成员表3;》//派生类增加或替代的保护成员
}
其中基类1,基类2,……是已声明的类。如果一个派生类可以同时有多个基类,称为多重继承(multiple-inheritance),这时的派生类同时得到了多个已有类的特征。多重继承的处理非常复杂,而且易出错,我们将放在后面讨论。一个派生类只有一个直接基类的情况称为单一继承(single-inheritance)。在这里先讨论单一继承。。图中箭头指向基类,这是一种传统画法。
基类1
基类2
……
基类n
派生类1
派生类2
基类
派生类1
派生类2
(a)多重继承(b)单继承
多重继承与单继承
在派生类定义的类体中给出的成员称为派生类成员,它们是新增加的数据和函数成员。这些新增加的成员是派生类对基类的发展,它们