前言:

public、protected、private 这三个权限修饰字既可以用来修饰成员变量和成员函数,也可以用来修饰继承类型。下面将讨论继承类型。

 

成员变量和成员函数的访问权限:

  • 派生类对基类成员的访问权限,与是public 、 protected 、 private继承类型没关系,仅仅与基类中成员的权限属性有关系:
  • 派生类能访问基类的public和protected成员,不能访问private成员。

 

继承权限是用来控制 “派生类的使用者” 对基类成员的访问权限:

这里涉及到两个概念:

  1. 派生类对基类成员的访问权限
  2. 派生类使用者对基类成员的访问权限

类成员的使用者有三种:

  1. 自己的其他成员,比如成员函数可以使用成员变量,不管成员变量是什么权限,注意,这里的使用仅限在这个类的实现中,通过类实例来访问,这属于类使用者的访问,而不是类自身的访问
  2. 派生类,派生类的实现(成员函数、成员变量)能够访问它基类的protected和public成员
  3. 派生类的派生类(孙类) 和 其他类,如果派生类是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成员变成自己的 哪种成员  ,而 类使用者 和 继承自己的 的类只需要依旧按照成员访问权限来访问自己即可 ”