- 类似于private权限, protect的权限对于类的使用着来说是不可见的
- 类似与pubic权限,protect的权限对于基类的派生类和友元是可见的
- 无法通过派生类访问基类对象的protect的成员
第三条就保证了无法通过派生类来绕过protect权限
例如
#include <iostream>
class Base {
protected:
int x;
};
class Sneaky : public Base {
void test1(Sneaky &sneaky) {
sneaky.x = 0;
}
void test2(Base &base) {
base.x = 0; // 不可以的。。
}
};
int main() {
return 0;
}
第三条条款的另一种说法
如果member
是直接定义在Y
里面的protected
或private
成员,只有当X
和Y
相同,才能够访问。在这里,因为static_cast<Y&>(y)
的类型是Y&
,X
和Y
不一样,所以答案自然是不能。
class Y
{
protected:
int member;
};
class X : public Y
{
public:
void Method(X& y)
{
&(static_cast<Y&>(y).member);
}
};