前面关于数组、指针和字符串的内容鸡啄米讲完了。现在开始鸡啄米将会介绍C++编程入门的一个很重要的知识点--继承与派生。
一.继承与派生的概念
在之前的教程中我们学习了类的抽象性、封装性以及数据的共享等以后,我们就可以对于现实中的问题进行抽象和处理了。但是面向对象设计中代码的复用性和扩展性还没有体现出来。对于某个问题前人已经有了既有成果,我们怎样不做重复性劳动而直接运用?在问题有了新的发展以后我们怎样快速高效的修改或扩展现有的程序?这些都可以通过类的继承与派生来解决。
类是对现实中事物的抽象,类的继承和派生的层次结构则是对自然界中事物分类、分析的过程在程序设计中的体现。下图说明了某个公司雇员的派生关系。位于最高层的雇员其抽象程度最高,是最具一般性的概念。最下层抽象程度最低,最具体。从上层到下层是具体化的过程,从下层到上层是抽象话的过程。面向对象设计中上层与下层是基类与派生类的关系。
我们看到上图中此公司的雇员有三类:兼职技术人员、管理人员和销售人员。每个雇员都有姓名、级别和薪水等信息。每种雇员都可以升级,但升级方式不同。他们的月薪计算方式也不同,兼职技术人员应按实际工作小时数领取月薪,管理人员领取固定月薪,而销售人员是根据当月销售额领取提成。
这三类雇员的升级方式和月薪的计算方法等不同,所以不能用同一个类来描述,需要有三个类来分别抽象三类雇员。但这三个类中又有很多数据成员是一样的,例如姓名、级别和薪水等,函数成员也有很多相同的,只是可能实现方法不同,例如升级函数和计算月薪函数等。
我们应该先描述所有雇员的共性,再分别描述每类雇员。分别描述时应先说明他是雇员,然后描述他特有的属性和处理方法。这种描述方法在面向对象设计中就是类的继承与派生。对雇员共性进行描述就形成了基类,而对每类雇员的特性的描述可以通过从基类派生出子类来实现。
类的继承就是新类由已经存在的类获得已有特性,类的派生则是由已经存在的类产生新类的过程。这两个概念是两个相对的方向上的。
由已有类产生新类时,新类会拥有已有类的所有特性,然后又加入了自己独有的新特性。已有类叫做基类或者父类,产生的新类叫做派生类或者子类。派生类同样又可以作为基类派生新的子类,这样就形成了类的层次结构。
二.派生类的声明
派生类声明的语法形式为:
class 派生类名 : 继承方式1 基类名1, 继承方式2 基类名2, ... 继承方式n 基类名n
{
派生类成员的声明;
}
例如,类Parent1和Parent2是已经声明过的类,类Child是由这两个类派生出的子类,则声明Child类的基本形式为:
class Child : public Parent1, private Parent2
{
public:
Child();
~Child();
}
“基类名”(Parent1和Parent2)是已有类的名称,“派生类名”(Child)是从已有类产生的新类的名称。从上面的例子可以看到,一个派生类可以有多个基类,这叫做多继承。这种情况下派生类就同时具有多个基类的特性。一个派生类如果只有一个基类,则叫做单继承。我们在软件开发中用的最多的就是单继承,也就是一个派生类只有一个基类。同样,一个基类也可以产生多个派生类,这比多继承更常见。
基类产生派生类,派生类又可以作为基类再派生它自己的派生类,任何基类又可以产生多个派生类,这样就形成了一个类族。直接派生出某个类的基类叫做这个类的直接基类,基类的基类或者更高层的基类叫做派生类的间接基类。例如,类A派生出类B,类B派生出类C,则类A是类B的直接基类,类B是类C的直接基类,而类A是类C的间接基类。
我们在声明派生类时,除了要指明基类,还要指定继承方式。继承方式限定了派生类访问从基类继承来的成员的方式,指出了派生类成员或类外的对象对从基类继承来的成员的访问权限。每个“继承方式”只限定紧随其后的基类。继承方式有:公有继承、保护继承和私有继承,分别对应的关键字是public、protected和private。如果没有显式指定继承方式,则默认为私有继承。上面的例子中Child类继承Parent1类是公有继承,继承Parent2类是私有继承。关于继承方式的详细说明鸡啄米后面很快会讲。
派生类声明语法形式中的派生类成员指除了原封不动从基类中继承来的成员以外,修改的基类成员或者新增加的成员。派生类成员是对基类的扩展。
从基类继承产生派生类实现了对代码的复用,派生类中修改的基类成员或新增加的成员实现了对代码的扩展。这样继承与派生使得我们减少了重复性劳动,提高了软件开发效率,维护和扩展程序更容易。
鸡啄米今天主要讲了继承与派生的概念和派生类的声明方式,大家是不是对面向对象设计有了些更深入的认识了?如果有什么问题欢迎大家留言讨论。