3

我刚刚遇到这个问题,并且从 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++ 标准要通过基类指针来限制访问受保护的成员?

不重复:访问派生类中的受保护成员,我想询问在标准中禁止它的原因。

4

1 回答 1

5

仅仅因为您从 a 派生Base并不意味着您应该被允许访问任何其他派生自 的类的受保护成员Base。想象一个Derived2由继承自Base. 这样你就可以得到一个基础对象,Derived2并在Derived.

因此,基本上该标准确保您只修改您继承的受保护成员,而不会弄乱不相关的兄弟类的完整性。

于 2013-11-06T04:17:32.850 回答