C++类继承的访问控制权限

    《C++Primer》中15.5一节,有关于访问控制与继承的介绍,但是不知是翻译的问题还是介绍顺序的问题,总觉得理解起来不是特别清晰,现对C++的类继承与访问控制权限做一个总结,如有不准确之处还望指正。   

一、一个类的访问说明符

先介绍基础内容,一个类可以用访问说明符来封装自己的数据成员和函数成员,一共有三种访问说明符,public,private,protected。这些说明符,对于类内的访问和友元函数的访问都是开放的,对于类的用户的类外访问,只有public权限是开放的,另外两个都不开放。

二、被继承之后的访问权限问题

下面是本文的主要部分,也是让很多人很晕的地方。本文结合着理解帮助大家梳理。

设类B是基类,类D是继承了B的类,或称为子类。对于B的权限如何限制D我们一定要区分以下这两大类,一是对D类的编写者的约束,二是使用D的用户的约束。

1、对D的编写者而言,主要对是D内的成员函数和友元进行编写。其权限完全取决于B类各个成员本身的访问说明符。
public权限都可以使用,而protected权限,只针对D类的对象开放(当然包括通过this指针使用),而非对整个D类的开放。举个栗子,假如你在D中定义一个函数或友元函数,函数中定义了一个B类的对象,你就不能使用B对象的保护权限成员。但是,如果你在D的友元函数中定义了一个D的对象,你就能使用D对象的B类保护成员。对于private成员谁都不能用。

2、对于D的使用者而言,主要是在类外使用D,以及用D来派生新的类DD。除了要受到B的访问说明符约束以外,还要受到继承关系符(public共有继承, private私有继承, protected保护继承)的约束。作为D的使用者,你是从外部看D类,你仿佛看不到它是继承自B类的,所以B类和D类的所有成员似乎都融为一体了,我们要给这些成员一个统一的对外显示的权限,以供使用者使用,或者派生新的类。这个就遵循下面的表格了。


公有继承
私有继承
保护继承
基类中public
public
private
protected
基类中private
private
private
private
基类中protected
protected
private
protected

可见,从D类的使用者角度,公有继承中B类的权限照搬到D类中。私有继承中全部变为私有,保护继承中,公有权限变为了保护。

三、小结

在记忆这部分内容时,一定要把D类的定义者和D类的使用者区分来记。
对于定义者而言,继承说明符对他们没影响,只看B类的各种成员的访问说明符就行了,尤其注意保护权限,只针对D类内部和友元函数中的D类对象有效(当然包括this指针有效),而不是对D类有效。
对于使用者而言,他们可能都不知道有B类这个东西,就像我们可以很轻松的使用cout\cin这些顶层的类对象,而不用考虑整个流类的基类。所以,我们通过上面的表推导出D类的所有成员(把B和D堪看成一个大类就好)的最终权限,用这个权限来使用D类,或者继续派生新的类,这才是使用者需要考虑的事情。

四、误区

初学者容易产生这样一个误区:D类包含B类的成员,继承的时候相当于把B类中的成员附一个权限直接挪到D类中。这种想法是错误的。D只是继承了B,B还是一个整体,所以你在写构造函数的时候也是用B的构造函数来构造B的成员的。而不存在把B类拆了而合成一个新的类D。
作为D类的定义者,一定要牢记这个概念。但是作为D类的使用者,不想搞清楚继承关系,所以我在前文写到,“仿佛”D包含了B的成员而形成一个完整的大类,每个成员都有一个权限一样,这是类的对外表现,以供使用者使用和继续派生的,而非D类内部的实际情况。







猜你喜欢

转载自blog.csdn.net/weixin_37730368/article/details/79012512