public private protected 的辨析
一. public
1.作为类内成员的访问修饰符时,由public修饰的成员数据或者成员函数可以在类外(即派生类内以及实例化的对象后)以及类内进行随意访问
可以看到public成员Data在类外是可访问的(同理也可修改),但是private成员Private_Data在类外是无法看到访问的。
2.在pubilc作为修饰符的派生类中,不改变基类中成员在派生类中的访问权限,即原先是什么,在派生类中对外依旧是什么
基类中作为公有成员的Data在派生类中是完全可以访问到的,而对基类中私有成员的Private_Data的访问是非法的,会报错。
注意,这里基类中的成员访问修饰符与继承时的修饰符要区分开
继承修饰符仅改变基类成员在派生类中对外的访问权限,而不是改变基类成员对于派生类的访问权限。
换言之,以public继承为例,基类中的private成员在继承后的派生类中仍然是private的,也就是对于派生类外无法访问,同时对于派生类内,由于该成员在基类中也是private的,故基类也无法直接方位该成员
而对于private继承,基类中所有成员的修饰符在派生类外都被视为private(即基类中的pubilc,private以及protected成员在派生类外都无法访问),但是在派生类内对于基类成员的访问依然由基类成员的修饰符来决定,与继承类型无关
也就是说,类内的成员修饰符决定类内成员对外(实例化的对象以及派生类)的访问权限,而类继承时的修饰符决定继承来的基类成员在派生类中对外的访问权限
二,private
1.作为成员访问修饰符时,使用private修饰的成员仅可被类内方法以及类的友元函数来访问,对于类外是无法访问到的。详情也可见上图。
2.作为继承类型修饰时,private继承会使得基类中的所有类型(public,private,protected)在派生类中的对外访问权限都变为private,即在派生类外无法访问。
Test_kids是上述Test类的一个派生类,采用私有继承而来,可以看到在Test-kids内可以访问原先是public的Data,但是由于采用私有继承,其对外是私有的,因此Test_kids的一个对象T无法访问到Data。
三,protected
1.作为成员访问修饰符时,使用protected修饰的成员对于类外拥有两种不同的访问权限,对于派生类,protected成员同public成员一样可以访问,而对于实例化对象中,无法访问protected修饰的成员,此时类似于private,这样可以较好的实现对成员的保护,而且方便继承后对成员的直接访问使用
如上图,成员Protected_Data是由protected修饰的,可以看到Test类的成员test是无法访问的
而作为Test类的派生的Test_kids却可以访问Protected_Data。
2.作为继承类型修饰时,protected继承后,基类中的public,protected类型在派生类外的访问权限会变为protected,基类中的private类型在派生类外的访问权限仍然为private
四,最后用个表格来总结一下
修饰符 ----------- 访问权限 |
public | private | protected |
类内 | 可 | 可 | 可 |
对象中 | 可 | 不可 | 不可 |
派生类中 | 可 | 不可 | 可 |
private继承后对外 | private | private | private |
public继承后对外 | public | private | protected |
protected继承后对外 | protected | private | protected |