在C ++中受保护成员可访问性附加检查的原因是什么?

时间:2013-11-06 04:12:42

标签: c++

我刚刚遇到这个问题,并且从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,我想问一下在标准中禁止它的原因。

1 个答案:

答案 0 :(得分:5)

仅仅因为您从Base派生并不意味着您应该被允许访问源自Base的任何其他类的受保护成员。想象一下由Derived2继承的库提供的类Base。通过这种方式,您将能够获得Derived2的基础对象,并在Derived的代码中随意执行任何操作。

所以基本上这个标准确保你只修改你继承的受保护成员,而不是弄乱不相关的兄弟类的完整性。