我只是遇到了这个问题,并且从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 ++标准需要通过基类指针来限制访问受保护的成员?
不重复:访问派生类中的受保护成员,我想询问禁止在标准中使用它的原因。
仅仅因为您从a派生,Base
并不意味着您应该被允许访问任何其他派生自的类的受保护成员Base
。想象一下Derived2
,由库提供的类继承自Base
。这样,您就可以获取的基础对象,Derived2
并在的代码中对其进行任何处理Derived
。
因此,从根本上说,该标准可确保您只修改继承的受保护成员,并且不会弄乱无关兄弟姐妹类的完整性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句