c++中的访问控制

Posted moyu墨鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++中的访问控制相关的知识,希望对你有一定的参考价值。

先说结论:

类眼中的自己

类中定义的所有成员,不论是以public, protected还是private修饰,对类自身而言,它们都是可见的。

对象眼中的类

站在类的对象的角度去观察类,这时,只有类中的public成员是可见的。而其中的protected和private成员对对象而言,是不可见的。

友元眼中的类

站在友元的角度,类中所有的成员,不论是以public, protected还是private修饰,对友元而言,它们都是可见的。

派生类眼中的基类

派生类只能看见基类中的public和protected成员。而基类中的private成员,对于派生类而言,是不可见的。有一点必须注意,这里的public, protected和private均是指基类在被继承之后所呈现出来的成员访问权限。


下表展示了不同的继承方式,对基类中各成员访问权限的影响。

基类中所用访问控制修饰符

public

继承

protected继承 private继承
public public protected private
protected protected protected private
private private private private

所以,在派生类中,对于基类中的各成员的访问权限,我们可以按如下步骤去判断:

  1. 根据上表,确定基类中各成员在被继承之后访问权限的变化。

  2. 根据“ 派生类只能看见基类中的public和protected成员” 这一点来确定哪些基类成员可以被访问。

实践1--对象的访问权限

在以下的例子中,我们创建了一个简单的类。
下面,我们就来探究一下,对于该类中被不同访问控制修饰符修饰的成员,它们对于该类的对象都有什么样的访问权限。

c++中的访问控制

从以上实践中可以得出以下结论:

  1. 类可以访问自身的所有成员,不论是private, protected 还是 public。

  2. 对象只能访问类的public成员。

实践2--友元的访问权限

在以上例子的基础上,让我们来考虑一下,对于该类中被不同访问控制修饰符修饰的成员,该类的友元函数和友元类对这些成员都有什么样的访问权限。

c++中的访问控制

c++中的访问控制

由上例中可以看出,友元可以访问类中的private和protected成员,对于public成员,当然更是可以访问的了,虽然以上例子中并没有验证这一点。
所以,我们可以得出以下结论:

  1. 友元函数或友元类可以访问类中的所有成员。
    另外,关于友元还有一点需要注意。在友元中,只能通过对象来访问声明友元的类成员。

小结

现在,让我们换一个角度,通过以下表格总结一下。

访问控制修饰符 对象 友元
public 可见 可见 可见
protected 可见 不可见 可见
private 可见 不可见 可见

引入三种继承方式

在C++中,在继承的过程中,有以下三种继承方式,它们分别是:

  • public (公有继承)

  • protected (保护继承)

  • private (私有继承)
    这三个关键字与之前的三种访问控制修饰符刚好相同,但在这里,它们有不同的意义。

  1. 对于public继承,基类中的成员的访问控制修饰符不作任何改动,原样继承到派生类中。也就是说,基类中的public成员,在被以public方式继承之后,仍然是基类的public成员;基类中的protected成员,仍然是protected成员;基类中的private成员,它仍然是private成员。注意,在继承之后,基类中的private成员对于派生类是不可见的。

  2. 对于protected继承,基类中的public成员,在被以protected方式继承之后,它变成了基类的protected成员;基类中的protected成员,则仍然是protected成员;基类中的private成员,则仍然是private成员。注意,在继承之后,基类中的private成员对于派生类是不可见的。

  3. 对于private继承,基类中的public和protected和private成员,在被以private方式继承之后,在基类中均成为了private成员;而基类中的private成员,对派生类不可见。

1、public继承方式

在第一个例子的基础之上,我们通过public方式继承出一个新的派生类。

c++中的访问控制

c++中的访问控制

由以上例子可以看出:

  1. 基类中的private, protected, public成员,经由public继承之后,在派生类中分别为不可见private, protected,public成员。

  2. 派生类中不能访问基类的private成员,但可以访问基类的private和protected成员。

2、protected继承方式

在第一个例子的基础之上,我们通过protected方式继承出一个新的派生类。

c++中的访问控制

c++中的访问控制

由以上例子可以看出:

  1. 基类中的private, protected, public成员,经由protected继承之后,在派生类中分别为不可见private, protected,protected成员。

  2. 派生类中不能访问基类的private成员,但可以访问基类的private和protected成员。

3、private继承方式

在第一个例子的基础之上,我们通过private方式继承出一个新的派生类。

由以上例子可以看出:

  1. 基类中的private, protected, public成员,经由private继承之后,在派生类中均不可见。

  2. 派生类中不能访问基类的private成员,但可以访问基类的public和protected成员。

小结

  • 不论何种继承方式,派生类都不能访问基类的private成员,它只能访问基类的public和protected成员。

  • 三种继承方式对不同访问控制符修饰的成员的影响如下表所示。

基类中所用访问控制修饰符

public

继承

protected

继承

private

继承

public public protected private
protected protected protected private
private private private private

总结

  1. 友元和类一样,可以访问类的所有成员。

  2. 对象只能访问类的public成员。

  3. 派生类只能访问基类的public和protected成员,而不能访问基类的private成员。

  4. 对于派生出来的类,首先根据继承方式,确定基类各成员在经指定的继承方式继承后的访问控制权限(经继承后基类各成员是变成了public,protected还是private),然后根据第1、2、3点对各成员进行访问。

  5. 经继承后,基类中的成员会根据继承方式,对各成员的访问控制符进行修改。修改之后,基类中的private成员对派生类不可见。

参考文献

  • 郑莉 C++语言程序设计 类的友元 继承方式简介及公有继承 私有继承和保护继承

  • 菜鸟教程 C++ 类访问修饰符


以上是关于c++中的访问控制的主要内容,如果未能解决你的问题,请参考以下文章

C++ 类的继承一(访问控制)

C++ 文件和文件夹访问视图和控制

回顾C++:访问权限控制之 公有保护私有继承用法详解与总结

C++之类之访问控制与封装

(C++)4段代码弄清基本的访问控制

C++:类继承|| 类继承的定义访问控制protected类继承的构造函数