没那么简单的C++访问控制说明符
前言
C++中的访问控制说明符指的是public
、protected
、private
,这三个关键字一般出现在以下两个场景中:
- 进行class的定义时
- 进行class的继承时
关于这三个类型说明符的具体作用,前前后后也梳理过好几次了。但因为牵扯到这两个密切相关的场景,非常容易混淆,以为自己懂了,其实并没有。这次在IDE里认真做了试验,终结此问题。
问题
首先设置以下出场演员来定义问题:
- 一个类A,有成员变量A_pub_mem、A_pro_mem、A_pri_mem;
- 一个类AA,是A的派生类,也有自己的成员变量AA_pub_mem、AA_pro_mem、AA_pri_mem(当然还有继承自A的成员变量A_pub_mem、A_pro_mem、A_pri_mem);
现在问题可以描述为,在public
、protected
、private
的作用下,类A和类AA的成员变量对外部函数的可见性如何?
提一句,所谓对外部函数的可见性,实质意义是说,在这个函数的作用域内,知不知道A有a_xxx_mem这么一个成员。
结论
之前之所以迷惑的症结在于没有真正搞清楚这一点——这三个关键字在这两种场景下,分别是在约束谁的对外可见性?
答案是:
- 在第一种场景下,访问控制说明符约束的是a.A_pxx_mem的对外可见性;
- 在第二种场景下,访问控制说明符约束的是aa.A_pxx_mem的对外可见性;
作用的对象不同,意味着两个场景相互独立,互不影响。仔细思考这两个结论,可以知道:
- 外部函数是否可以访问A的成员变量只取决于这个变量在定义A时是pri/pro/pub中的哪一种;
- AA的成员函数是否可以访问AA基类部分的成员变量同样只取决于这个变量在定义基类时是pri/pro/pub中的哪一个,而不取决于继承方式;
- 外部函数是否可以访问AA基类部分的成员变量不仅取决于这个变量在定义基类是pri/pro/pub中的哪一种,还取决于继承方式,并且先看前者,再看后者;
最后,思考一个问题,检查你对上面的内容是否理解:
AA是A的一个派生类,AA中有一个成员变量是A的一个实例,那么请问,AA的成员函数能够访问这个实例的pro_mem吗?
答案是不能哦,仔细想想为啥,哈哈~
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!