null第4章 继承与派生第4章 继承与派生本章主要内容本章主要内容继承的概念
派生类
访问权限控制
派生类的构造函数和析构函数
多继承 继承的概念 继承的概念 类的继承就是根据一个类创建一个新类的过程。
新类自动具有已有类的所有成员,并可根据需要添加更多的成员。
换个角度,从已有类产生新类的过程就是类的派生。
通常将用来派生新类的类称为基类,又称为父类,而将派生出来的新类称为派生类,又称为子类。 派生类 派生类 派生类是特殊的基类,基类是派生类的抽象描述。派生类继承了基类的所有特性,但不等同于基类,否则就没有派生的必要了。
继承的作用就是体现特殊与一般的关系,寻找有共性的事物间的差异,求其发展;另一个作用是代码重用,从基类派生子类,无需修改基类的代码,就可以直接调用基类的成员,而自己的代码只需在派生类中实现即可。派生类的定义派生类的定义class <派生类名>:<继承方式> <基类名>
{
<派生类新定义成员>
};
其中,<继承方式>有三种:公有继承、私有继承和保护继承,分别用关键字public、private和protected表示。缺省情况下为私有继承。
派生类的生成过程 派生类的生成过程 分析派生新类的过程可知,派生类的生成经历了三个步骤:
吸收基类成员
改造基类成员
添加派生类新成员 访问权限控制 访问权限控制 不论哪种继承方式,派生类新定义成员均不能直接访问基类的私有成员,只能通过基类的公有成员函数或保护成员函数访问基类的私有数据成员,而基类的私有成员函数根本就不会继承,更谈不上使用。所以,除非仅限于本类使用,否则,一般不将成员函数定义为私有成员。公有继承的访问权限控制 公有继承的访问权限控制 类的继承方式为公有继承时,在派生类中,继承的基类的公有成员和保护成员的访问属性不变,而对基类的私有成员不可访问。
即基类的公有成员和保护成员被继承后分别作为派生类的公有成员和保护成员,派生类的成员可以直接访问它们,而派生类的成员无法访问基类的私有成员。在类外,派生类的对象可以访问继承下来的基类公有成员。 私有继承的访问权限控制 私有继承的访问权限控制 当类的继承方式为私有继承时,在派生类中,继承的基类的公有成员和保护成员变为私有成员,而对基类的私有成员不可访问。
即基类的公有成员和保护成员被继承以后作为派生类的私有成员,派生类的成员可以直接访问它们,而派生类的成员无法访问基类的私有成员。在类外,派生类的对象无法访问基类的所有成员。因此,私有继承之后,基类的成员再也无法在以后的派生类中发挥作用,出于这种原因,一般不使用私有继承方式。保护继承的访问权限控制 保护继承的访问权限控制 当类的继承方式为保护继承时,在派生类中,继承的基类的公有成员和保护成员变为保护成员,而对基类的私有成员不可访问。
即基类的公有成员和保护成员被继承以后作为派生类的保护成员,派生类的成员可以直接访问它们,而派生类的成员无法访问基类的私有成员。在类外,派生类的对象无法访问基类的所有成员。派生类的构造函数 派生类的构造函数 派生类构造函数的一般格式如下: <派生类名>(<总参数表>):<基类名>(<参数表1>),<子对象名>(<参数表2>)
{
<派生类数据成员的初始化>
};
派生类的析构函数 派生类的析构函数 由于基类的析构函数也不能被继承,因此,派生类的析构函数必须通过调用基类的析构函数来做基类的一些清理工作。
调用顺序是:先调用派生类的析构函数,再调用对象成员类的析构函数(如果有对象成员),最后调用基类的析构函数,其顺序与调用构造函数的顺序相反。多继承 多继承 根据派生类继承基类的个数,将继承分为单继承和多继承。
当派生类只有一个基类时称为单继承,以上所讨论的都是单继承。
当派生类有多个基类时称为多继承。单继承可以看作是多继承的一个特例,多继承可以看作是多个单继承的组合,它们有很多相同特性。 多继承的定义格式 多继承的定义格式 多继承可以看作是单继承的扩展,派生类与每个基类之间的关系可以看作是一个单继承。在C++中,多继承的定义格式如下: class <派生类名>:<继承方式> <基类名1>,…,<继承方式> <基类名n>
{
<派生类新定义成员>
};
多继承的构造函数 多继承的构造函数 <派生类名>(<总参数表>):<基类名1>(<参数表1>),…,< 基类名n> (<参数表n>)
{
<派生类数据成员的初始化>
};
虚基类 虚基类 在派生类中对基类成员的访问应该是唯一的。
但是,在多继承方式下,可能造成对基类中某个成员的访问出现不唯一的情况,称为对基类成员访问的二义性问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
。
解决的办法是用作用域运算符“::”进行限定,另外还可以设置虚基类来解决此问题。虚基类的定义格式 虚基类的定义格式 class <派生类名>:virtual <继承方式><共同基类名>
虚基类的初始化 虚基类的初始化 虚基类的初始化与一般多继承的初始化在语法上相同,但构造函数的调用顺序有所不同,规则如下:
先调用虚基类的构造函数,再调用非虚基类的构造函数。
若同一层次中包含多个虚基类,其调用顺序按定义时顺序。
若虚基类由非虚基类派生而来,则仍按先调用基类构造函数,再调用派生类构造函数的顺序。