受保护成员辅助功能额外签入C++的原因是什么?

What's the reason for protected member accessibility additional check in C++?

本文关键字:C++ 是什么 成员 功能 受保护      更新时间:2023-10-16

我只是跑到这个问题,并从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++标准费心通过基类指针限制访问受保护的成员?

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

仅仅因为您从Base派生并不意味着您应该被允许访问从Base派生的任何其他类的受保护成员。想象一个类Derived2由一个从Base继承的库提供的。这样,您将能够获得Derived2的基本对象,并在Derived代码中对其进行任何操作。

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