前言:
public、protected、private 这三个权限修饰字既可以用来修饰成员变量和成员函数,也可以用来修饰继承类型。下面将讨论继承类型。
成员变量和成员函数的访问权限:
- 派生类对基类成员的访问权限,与是public 、 protected 、 private继承类型没关系,仅仅与基类中成员的权限属性有关系:
- 派生类能访问基类的public和protected成员,不能访问private成员。
继承权限是用来控制 “派生类的使用者” 对基类成员的访问权限:
这里涉及到两个概念:
- 派生类对基类成员的访问权限
- 派生类使用者对基类成员的访问权限
类成员的使用者有三种:
- 自己的其他成员,比如成员函数可以使用成员变量,不管成员变量是什么权限,注意,这里的使用仅限在这个类的实现中,通过类实例来访问,这属于类使用者的访问,而不是类自身的访问
- 派生类,派生类的实现(成员函数、成员变量)能够访问它基类的protected和public成员
- 派生类的派生类(孙类) 和 其他类,如果派生类是public继承基类的,那么这两种类都可以“ 通过多态 ”直接访问基类的public成员。如果是private的,那么无论如何都不能 “ 通过多态 ”直接访问基类的任何成员,包括public的,当然,你可以直接通过基类指针来访问。
目前已知场景有两个:
通过private继承,来控制孙类对基类的成员访问。
private继承可以理解为:可传家产(public)到儿子辈就被截住了,孙子辈用不到爷爷辈的东西。
public继承可以理解为:可传家产(public)儿子辈一点没动,孙子辈可以接这用爷爷辈的东西。即:哪一层继承做了private限制,对上一层的访问就在哪一层停止,后续的继承都没法突破这层限制。
每一层只能控制自己下一层对自己上一层的访问,而自己永远都能够访问上一层的public东西。
通过private继承,来控制类使用者通过基类指针指向派生类。
例:
class A{
...
}
class B:private A{
...
}
main{
A* pa;
B b;
pa = &b; //如果是private继承,则词句编译不过,public继承就可以
//因为这里是main函数这么一个类使用者试图通过派生类指针来访问基类成员
//同理,如果这里不是main函数,而是类外一个类C,同样也允许,因为他们
//对于 A 和 B来说都是使用者。
}
小结:
1)成员变量的权限,是用来控制 子类 和 使用者对自己成员的访问。
2)继承权限,是用来控制 自己的子类 对 自己的父类 的 “”“”public”““”成员的访问,注意这里说的是public成员,因为无论如何都无法访问private成员。
可以简单理解为:
“ 使用哪种继承,就会把基类的public成员变成自己的 哪种成员 ,而 类使用者 和 继承自己的 的类只需要依旧按照成员访问权限来访问自己即可 ”