看了C++ Primer 5e里面关于这三者的作用,感觉有点杂乱,在此作个小结。
C++里面,public/protected/private可以出现在两个地方:
1)类体内。表示访问权限。 或者2)派生列表内。表示继承方式。
在讲具体区分前,有必要理解C++里面有哪些用户(users)角色。
(以下引自Primer)考虑继承体系(inheritance hierarchy),C++类用户可以分为三类:
1. 普通用户(ordinary users)。即在代码里使用该类的object。这类用户访问权限最小,只能访问public成员。
2. 类的实现者(implementors)。即在该类的成员(函数)或者友元(函数/类)里面编写代码。这类用户访问权限最大, 可以访问该类的任意成员。
3. 派生类(derived classes),这里只考虑直接派生。这类用户访问权限介于1. 和2. 之间,为了使得派生类可以访问直接基类的部分成员,同时使得这些成员不被普通成员访问,设计了protected权限标识。
下面是具体区分,从类的三种用户来理解:
一、作为访问权限
public | protected | private | |
1.普通用户 | √ | × | × |
2.类的实现者 | √ | √ | √ |
3.派生类
(pubic继承)
| √ | √ | × |
3.派生类
(protected继承)
| √ | √ | × |
3.派生类
(private继承)
| √ | √ | × |
可见,private访问权限限制了只有在该类的成员或者友元里才能使用,禁止一切其他访问(普通用户、派生类)。
protected访问权限的限制“放松”了一点,表示该类的成员或者友元以及派生类可以访问,普通用户禁止访问。
二、作为继承方式
基类的private在派生类里均不可访问。
public继承(表现"is a"关系,具体可见《Effective C++》):基类成员的访问权限在派生类里保持不变。
private继承(表现"has a"关系,具体可见《Effective C++》):基类成员的在派生类里的访问权限全部为private。
protected继承(不建议使用):基类public成员在派生类里的访问权限变为protected,其他保持不变。
通过访问权限/继承方式的多种组合,C++类为继承体系上不同的用户以提供了灵活的访问权限,可以通过理解public/protected/private设计的缘由(如上所述)来记忆不同组合的含义。
当然,如果需要在子类中将一个或多个继承的成员恢复其在基类中的访问权限,可以通过1) 使用using声明; 2) 使用完全限定式。比如假设D要访问其基类B的某个private成员int b,可以在D类体内使用B::b完全限定的形式访问。
这两种方式破坏了固有的权限限定规则,在此不作过多讨论。