在上一节中,我们看到了派生类的定义方法,用到了public的公有继承,实际这里一共有三种方式,分别是公有继承、私有继承、保护继承。
不同的继承方式,主要区别在于基类中不同访问权限的成员在派生类中的访问权限变化情况。下面一一介绍。
1. 公有继承:
在公有继承的模式下,其特点如下:
(1)基类中的公有成员,在派生类中仍然为公有成员,当然无论派生里的成员函数还是派生类对象都可以访问。
(2)基类中的私有成员,无论在派生类的成员还是派生类对象都不可以访问。
(3)基类中的保护成员,在派生类中仍然是保护类型,可以通过派生类的成员函数访问,但派生类对象不可以访问。
2. 私有继承:
在私有继承的情况下,公有类型、私有类型、受保护类型三种成员的访问权限如下:
(1)基类的公有和受保护类型,被派生类私有继承吸收后,都变为派生类的私有类型,即在类的成员函数里可以访问,不能在类外访问。
(2)而基类的私有成员,在派生类无论类内还是类外都不可以访问。
我们可以看出来,如果为私有派生,则基类的私有成员在派生类甚至再派生出的子类中,都无法再使用,没有什么存在意义,故这种使用情况比较少。
3. 保护继承:
保护类型的继承,特点如下:
(1)基类的公有成员和保护类型成员在派生类中为保护成员。
(2)基类的私有成员在派生类中不能被直接访问。
可以看的出来,派生类里的成员函数可以访问基类的公有成员和保护成员,但在类外通过派生类对象则无法访问它们。同样,无论派生类里的成员函数还是通过类对象都无法访问基类中的私有成员。
下面还是以时钟和闹钟的程序代码为例,实验基类中不同类型通过不同权限派生的访问问题。对于公有类型,无论在派生类的成员方法里还是类外都可以调用,编译无错运行如下:
但对于私有成员,我们试图增加一行代码见41行。在派生类的成员函数中对吸收来自基类的H变量进行赋值,编译得到报错,见红色方框与下方提示:
可以看到错误信息“H为私有类型”。
而对于受保护类型的,我们尝试在基类中定义一个protected类型的变量w,并试图在公有继承的派生类方法中赋值使用,可以看到下图的情况,完全可以访问。如下图:
对于私有继承,公开类型的成员在类外访问情况:
大家可以自行上机实验,验证不同类型成员在公有继承下的访问情况。
学习并实验过后,我们可以总结如下:
1. 基类私有成员,无论什么派生权限,派生类内成员函数和类外都是不可以访问的。
2. 私有继承,无论基类原来什么类型,在派生类外通过成员函数都不可以访问。
3. 派生类从基类中吸收的成员的访问权限为基类中访问权限和派生时派生权限两者之中最低的一种。
并根据派生的权限、基类中定义的权限,在派生类的类内和类外不同访问时的组合情况,列出下表:
公有继承 | 保护继承 | 私有继承 | ||||
访问位置 | 类内 | 类外 | 类内 | 类外 | 类内 | 类外 |
公有成员 | 可以 | 可以 | 可以 | 不可以 | 可以 | 不可以 |
保护成员 | 可以 | 不可以 | 可以 | 不可以 | 可以 | 不可以 |
私有成员 | 不可以 | 不可以 | 不可以 | 不可以 | 不可以 | 不可以 |