第七章 继承与派生
7.1类的继承与派生
继承:新类从已有类得到已有的特性
派生:从已有类产生新类的过程
已有类:基类/父类 新类:派生类/子类
继承与派生类的对应关系:
单继承:派生类只从一个基类派生
多继承:****** 从多个*********
直接基类:直接参与派生出某类的基类
间接基类:基类的基类,或更高的基类
继承与派生的目的:
继承的目的:实现代码重用
派生的目的:当新问题出现,原有程序无法完全解决时,需对其进行扩展与改进
派生类的生产过程:
① 吸收基类成员:吸收除构造函数和析构函数以外的全部基类成员
② 改造基类成员:1.基类成员的访问控制 2.对基类数据或成员函数的覆盖和隐藏
③ 添加新成员:[继承与派生机制的核心]
7.2访问控制
·在派生类中的成员函数中:
可以直接访问基类中的public和protected成员,不能访问基类的private成员
·不同继承方式的影响主要体现在:
① 派生类成员对基类成员的访问控制
② 派生类的对象对基类成员的访问控制
公有继承:
·基类的publilc和protected成员的访问属性在派生类中保持不变
·通过派生类对象只能访问基类的public成员
私有继承:
·**********************都以private身份出现在派生类中
·***********不能********任何成员
保护继承:
·**********************protected***************
·***********不能********任何成员
7.3类型兼容规则
在需要基类对象的任何地方,都可以使用公有派生类的对象来替代
[替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员]
替代包括:
① 派生类的对象可以隐含转换为基类对象
② ********对象 可以初始化为 基类的引用
③ *******指针可以隐含转换为基类指针
例如:
class B{…}; class D:public B{.. .}; B b1, *pb1; D d1;
b1 = d1;//①
B &rb = d1;//②
pb1 = &d1;//③
7.4派生类的构造和析构函数
继承时的构造函数:
·基类的构造函数不能被继承,因此可能要在派生类中自行声明构造函数
·派生类声明构造函数时,只要对本类中新增成员进行初始化。对继承来的基类成员的初始化,由基类构造函数完成。
构造函数的调用次序:
① 调用基类构造函数(顺序为它们被继承时声明的次序)
② 对新增成员对象初始化(在类中声明的顺序)
③ 执行派生类的构造函数体中的内容
析构函数调用次序与构造函数相反
7.5派生类成员的标识与访问
同名隐藏原则:当派生类与基类中有同名成员时:
·通过派生类对象,使用的是派生类中的同名成员
·若要通过派生类对象访问基类中被覆盖的同名成员,应用基类名限定
二义性问题:
① 在多继承时,基类与派生类之间,或基类之间出现同名成员时,将出现访问时的二义性---采用虚函数,或同名隐藏原则来解决
② 当派生类从多个基类派生,而这些基类又从同一个基类派生,则在访问此共同基类中的成员时,将产生二义性---采用虚基类来解决
虚基类:用于有共同基类的场合
作用:
·主要用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题
·为最远的派生类提供唯一的基类成员,而不重复产生多次拷贝