1. 类似于private权限, protect的权限对于类的使用着来说是不可见的
  2. 类似与pubic权限,protect的权限对于基类的派生类和友元是可见的
  3. 无法通过派生类访问基类对象的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里面的protectedprivate成员,只有当XY相同,才能够访问。在这里,因为static_cast<Y&>(y)的类型是Y&XY不一样,所以答案自然是不能。

class Y
{
   
protected:
    int member;
};

class X : public Y
{
   
public:
    void Method(X& y)
    {
   
        &(static_cast<Y&>(y).member);
    }
};