文章目录
第7章 继承与派生
7.1 类的继承与派生
7.1.1 继承关系举例
类的继承,就是新的类从已有类那里得到已有的属性。
类的派生,就是已有类产生新类的过程。
基类(父类):原有的类称为基类或父类。
派生类(子类):新类称为派生类或子类。
基类的所有成员都是其派生类的成员,派生类还可以有自己的新成员。
7.1.2 派生类的定义
定义派生类:
class 派生类名:继承方式 基类名1,继承方式 基类名2,...,继承方式 基类名n{
派生类成员声明;
};
多继承:一个派生类,可以同时有多个基类,这种情况称为多继承。
单继承:一个派生类只有一个基类,这种情况称为单继承。
继承具有传递性。
直接基类:直接参与派生出某类的基类,称为直接基类。
间接基类:基类的基类,甚至更高层的基类,称为间接基类。
继承方式关键字为:public(公有继承)、protected(保护继承)、private(私有继承)。
类中默认继承方式是private(私有继承)。
结构体中默认继承方式为public。
继承方式规定了如何访问从基类继承的成员。
类的继承方式指定了派生类成员以及类外对象对于从基类继承来的成员的访问权限。
派生类成员:指除了从基类继承来的所有成员之外,新增加的数据和函数成员。
7.1.3 派生类生成过程
派生出新类的过程可分为三个步骤:吸收基类成员、改造基类成员、添加新的成员。
(1)吸收基类成员:派生类接收基类中除构造函数和析构函数外的所有非静态成员。
(2)改造基类成员:对基类成员的访问控制,以及对基类数据或函数成员的覆盖(见第8章)或隐藏(在派生类中声明一个和基类的数据或函数成员同名的成员)。
同名隐藏规则:如果派生类声明了一个和某基类成员同名的新成员(如果是成员函数,则参数表也要相同,参数不同的情况属于重载),派生类的新成员就隐藏了外层同名成员。这时,在派生类中或者通过派生类的对象,直接使用成员名,就只能访问到派生类中声明的同名成员,基类中的同名成员就被“隐藏”了,这称为同名隐藏规则。
(3)添加新的成员:添加新的数据和函数成员以扩展功能,添加构造函数与析构函数以进行初始化和扫尾工作。
7.2 访问控制
7.2.1 公有继承
公有继承时,基类的公有、保护成员的访问属性在派生类中不变,而基类的私有成员在派生类中不可直接访问。也就是说,基类公有、保护成员在派生类中仍作为公有、保护成员,派生类的其他成员可以直接访问它们。在类族外只能通过派生类的对象访问从基类继承的公有成员,而无论是派生类的成员,还是派生类的对象,都无法直接访问基类的私有成员。
7.2.2 私有继承
私有继承时,基类的公有、保护成员都以私有成员的身份出现在派生类中,而基类的私有成员在派生类中不可直接访问。
7.2.3 保护继承
保护继承时,基类的公有、保护成员都以保护成员的身份出现在派生类中,而基类的私有成员在派生类中不可直接访问。
如果合理地利用保护成员,就可以在类的复杂层次关系中,在共享与成员隐藏之间找到一个平衡点,既能实现成员隐藏,又能方便继承,实现代码的高效重用和扩充。
7.3 类型兼容规则
类型兼容规则:在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。
类型兼容规则中的替代包括以下情况:
(1)派生类的对象可以隐含地转换为基类的对象;
(2