我刚刚遇到这个问题,并且从C ++标准中知道如下定义它(强调我的)
除了前面第11章中描述的那些之外的附加访问检查 在非静态数据成员或非静态成员函数时应用 是其命名类的受保护成员(11.2)115如上所述 之前,因为引用而授予对受保护成员的访问权限 发生在朋友或某些C类的成员中。如果要形成 指向成员(5.3.1)的指针,嵌套名称说明符应表示C 或者从C派生的类。所有其他访问涉及(可能 隐式)对象表达式(5.2.5)。 在这种情况下,类 对象表达式应为C或从C派生的类。
代码段:
class Base
{
protected:
int i;
};
class Derived : public Base
{
public:
// I cannot define it as void memfunc(Derived* obj) because of signature requirement.
void memfunc(Base* obj)
{
obj->i = 0; // ERROR, cannot access private member via Base*
Derived* dobj = (Derived*)(obj);
dobj->i = 0; // OK
}
};
那么检查的原因是什么?为什么C ++标准要通过基类指针限制访问受保护的成员?
不重复:Accessing protected members in a derived class,我想问一下在标准中禁止它的原因。
答案 0 :(得分:5)
仅仅因为您从Base
派生并不意味着您应该被允许访问源自Base
的任何其他类的受保护成员。想象一下由Derived2
继承的库提供的类Base
。通过这种方式,您将能够获得Derived2
的基础对象,并在Derived
的代码中随意执行任何操作。
所以基本上这个标准确保你只修改你继承的受保护成员,而不是弄乱不相关的兄弟类的完整性。