我刚刚遇到这个问题,并且从 C++ 标准中知道将其定义如下(强调我的)
当非静态数据成员或非静态成员函数是其命名类 (11.2) 的受保护成员 115 时,将应用第 11 条中所述之外的附加访问检查。如前所述,授予对受保护成员的访问是因为引用出现在某个类 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++ 标准要通过基类指针来限制访问受保护的成员?
不重复:访问派生类中的受保护成员,我想询问在标准中禁止它的原因。