㈠ 继承的有关概念
1.继承是面向对象程序设计思想最重要的概念之一,其主要作用是提高软件的可重用性和可维护性。在C++中,实现继承的机制是通过派生得到的,原类(被继承的类)称为基类,在基类的基础上创建的新类称为派生类。
2.继承具有层次结构,越在上面的类越具有普通性和共性,而下层类比上层类更具体,越在下层的类越细化、专门化;同时,继承具有传递性,即派生类能自动继承上层基类的全部数据结构及操作方法(数据成员及成员函数)。
3.在C++中,继承分为单继承与多继承。只有一个基类的继承称为单继承;有二个或以上基类的继承称为多继承。
㈡ 派生类的定义
1.定义格式
class派生类名:继承方式 基类名
{ 派生类新定义的成员 };
2.说明
⑴在定义派生类时用“:”将派生类与基类分开,构成类的层次结构;
⑵派生类与普通类的定义一样,仍然包括数据成员与成员函数。
(三) 不同继承方式下基类成员在派生类中的访问特性
1.继承方式
在C++中,继承方式包括公有继承(public)、私有继承(private)和保护继承(protected)三种继承方式,相应的派生类分别称为公有派生类、私有派生类、保护派生类。
2.不同继承方式下基类成员在派生类中的访问特性
⑴基类的私有成员在派生类的作用域内均不可见,即无论是哪种继承方式,派生类的成员函数均不能使用基类的私有成员,而只能调用基类中的公有成员函数访问。
⑵在公有继承方式下,基类中的公有成员、保护成员在派生类中的访问权限不变,即仍为公有成员、保护成员。
⑶在保护继承方式下,基类中的公有成员、保护成员在派生类中均改变为保护成员。
⑷在私有继承方式下,基类中的公有成员、保护成员在派生类中均改变为私有成员。
(四) 类及对象的访问权限
1.派生类对基类成员的访问权限
由实验四可知,在不同继承(派生)方式下,基类的成员在派生类中(作用域内)的访问权限不同。
⑴基类的私有成员
无论哪种继承方式,基类的私有成员在派生类的作用域内均不可见,只能通过基类的公有成员函数访问。
⑵基类的保护成员、公有成员
在公有继承下,基类的保护成员、公有成员在派生类的访问特性不变,在派生类的作用域内可以直接访问,也可以调用基类的公有成员访问;在私有继承方式下,基类的保护成员、公有成员均改变成私有成员,但在派生类作用域内仍可以直接访问(在类中,可以访问自身的所有成员)。
2.类对象对类成员的访问权限
无论是基类对象或是派生类的对象,都只能访问所属类的公有成员,而私有成员、保护成员只能通过调用所属类的公有成员函数访问。
3.派生类对象对基类私有数据成员、保护成员的访问
⑴公有继承(public)方式
①直接通路 在公有派生方式下,派生类对象可直接调用基类的公有成员函数访问基类的私有成员、保护成员:
派生类对象→基类公有成员函数→基类的私有成员
派生类对象→基类公有成员函数→基类的保护成员
②间接通路
派生类对象→派生类公有成员函数→基类公有成员函数→基类的私有成员
派生类对象→派生类公有成员函数→基类公有成员函数→基类的保护成员
派生类对象→派生类公有成员函数→基类的保护成员
⑵私有继承(public)方式
①间接通路 在私有派生方式下,直接通路被隔断,只能用间接方式
派生类对象→派生类公有成员函数→基类公有成员函数→基类的私有成员
派生类对象→派生类公有成员函数→基类公有成员函数→基类的保护成员
派生类对象→派生类公有成员函数→基类的保护成员![](https://img-blog.csdn.net/20171008120959952?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzc4NjA5NDI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
②声明调整机制
在C++提供了一种声明调整机制,即在私有继承的派生类中重新将基类的公有成员函数声明为公有的,这样派生类对象就可以直接访问基类的公有成员。
格式:
public:
基类名::基类公有成员函数名;
(五)多继承
㈠ 多继承的概念
如果一个派生类由二个或二个以上的基类派生得到,称为多重继承(多继承)
㈡ 多继承派生类的定义
格式:
class 派生类名:继承方式1 , 基类名1, 继承方式2, 基类名2, …
{ 派生类新定义的成员 }
㈢ 多继承派生类的构造函数
1.定义
格式:
构造函数名(总参数表):基类名1(参数表1), 基类名2(参数表2),…
{ 构造函数的函数体 }
2.说明
⑴多继承的构造函数的总参数表必须提供所有基类构造函数的值及新增数据成员的值。
⑵定义派生类对象时,多继承方式下构造函数的执行顺序为:先执行所有基类的构造函数(按排列顺序)后执行派生类的构造函数。
⑶释放派生类对象时,析构函数的执行顺序与构造函数的执行顺序相反。
㈣ 多继承派生类中为数据成员提供值的函数
在多继承方式下,为数据成员提供值的函数必须同时为所有基类的数据成员提供值。
㈤ 多继承的二义性
1.同名函数产生的二义性
在多重继承方式下,如果在多个基类中有同名成员函数,可能出现二义性问题。解决办法是在调用函数时使用类名及作用域运算符。
2.间接基类产生的二义性
在多重继承下,如果一个派生类由二个或以上基类派生得到,而这些基类又是由一个基类派生得到的,也会产生二义性。解决办法是使用虚基类,即在定义直接基类时,将间接基类说明为虚基类。
定义格式:
class 直接基类名 :virtual 继承方式 间接基类名
{ 派生类新定义的成员 }
(三) 不同继承方式下基类成员在派生类中的访问特性
1.继承方式
在C++中,继承方式包括公有继承(public)、私有继承(private)和保护继承(protected)三种继承方式,相应的派生类分别称为公有派生类、私有派生类、保护派生类。
2.不同继承方式下基类成员在派生类中的访问特性
⑴基类的私有成员在派生类的作用域内均不可见,即无论是哪种继承方式,派生类的成员函数均不能使用基类的私有成员,而只能调用基类中的公有成员函数访问。
⑵在公有继承方式下,基类中的公有成员、保护成员在派生类中的访问权限不变,即仍为公有成员、保护成员。
⑶在保护继承方式下,基类中的公有成员、保护成员在派生类中均改变为保护成员。
⑷在私有继承方式下,基类中的公有成员、保护成员在派生类中均改变为私有成员。
(四) 类及对象的访问权限
1.派生类对基类成员的访问权限
由实验四可知,在不同继承(派生)方式下,基类的成员在派生类中(作用域内)的访问权限不同。
⑴基类的私有成员
无论哪种继承方式,基类的私有成员在派生类的作用域内均不可见,只能通过基类的公有成员函数访问。
⑵基类的保护成员、公有成员
在公有继承下,基类的保护成员、公有成员在派生类的访问特性不变,在派生类的作用域内可以直接访问,也可以调用基类的公有成员访问;在私有继承方式下,基类的保护成员、公有成员均改变成私有成员,但在派生类作用域内仍可以直接访问(在类中,可以访问自身的所有成员)。
2.类对象对类成员的访问权限
无论是基类对象或是派生类的对象,都只能访问所属类的公有成员,而私有成员、保护成员只能通过调用所属类的公有成员函数访问。
3.派生类对象对基类私有数据成员、保护成员的访问
⑴公有继承(public)方式
①直接通路 在公有派生方式下,派生类对象可直接调用基类的公有成员函数访问基类的私有成员、保护成员:
派生类对象→基类公有成员函数→基类的私有成员
派生类对象→基类公有成员函数→基类的保护成员
②间接通路
派生类对象→派生类公有成员函数→基类公有成员函数→基类的私有成员
派生类对象→派生类公有成员函数→基类公有成员函数→基类的保护成员
派生类对象→派生类公有成员函数→基类的保护成员
⑵私有继承(public)方式
①间接通路 在私有派生方式下,直接通路被隔断,只能用间接方式
派生类对象→派生类公有成员函数→基类公有成员函数→基类的私有成员
派生类对象→派生类公有成员函数→基类公有成员函数→基类的保护成员
派生类对象→派生类公有成员函数→基类的保护成员
②声明调整机制
在C++提供了一种声明调整机制,即在私有继承的派生类中重新将基类的公有成员函数声明为公有的,这样派生类对象就可以直接访问基类的公有成员。
格式:
public:
基类名::基类公有成员函数名;
㈠ 多继承的概念
如果一个派生类由二个或二个以上的基类派生得到,称为多重继承(多继承)
㈡ 多继承派生类的定义
格式:
class 派生类名:继承方式1 , 基类名1, 继承方式2, 基类名2, …
{ 派生类新定义的成员 }
㈢ 多继承派生类的构造函数
1.定义
格式:
构造函数名(总参数表):基类名1(参数表1), 基类名2(参数表2),…
{ 构造函数的函数体 }
2.说明
⑴多继承的构造函数的总参数表必须提供所有基类构造函数的值及新增数据成员的值。
⑵定义派生类对象时,多继承方式下构造函数的执行顺序为:先执行所有基类的构造函数(按排列顺序)后执行派生类的构造函数。
⑶释放派生类对象时,析构函数的执行顺序与构造函数的执行顺序相反。
㈣ 多继承派生类中为数据成员提供值的函数
在多继承方式下,为数据成员提供值的函数必须同时为所有基类的数据成员提供值。
㈤ 多继承的二义性
1.同名函数产生的二义性
在多重继承方式下,如果在多个基类中有同名成员函数,可能出现二义性问题。解决办法是在调用函数时使用类名及作用域运算符。
2.间接基类产生的二义性
在多重继承下,如果一个派生类由二个或以上基类派生得到,而这些基类又是由一个基类派生得到的,也会产生二义性。解决办法是使用虚基类,即在定义直接基类时,将间接基类说明为虚基类。
定义格式:
class 直接基类名 :virtual 继承方式 间接基类名
{ 派生类新定义的成员 }