【发布时间】:2013-11-17 05:04:20
【问题描述】:
我刚刚遇到这个问题,并且从 C++ 标准中知道它的定义如下(强调我的)
除前面第 11 条所述之外的附加访问检查 在非静态数据成员或非静态成员函数时应用 是其命名类 (11.2)115 的受保护成员,如所述 早些时候,授予对受保护成员的访问权限,因为引用 发生在某个 C 类的朋友或成员中。如果访问要形成 指向成员 (5.3.1) 的指针,嵌套名称说明符应表示 C 或从 C 派生的类。所有其他访问都涉及(可能 隐式)对象表达式(5.2.5)。 在这种情况下, 对象表达式应为 C 或从 C 派生的类。
代码sn-p:
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++ 标准要通过基类指针来限制访问受保护的成员?
Not Duplicate to:Accessing protected members in a derived class,我想问一下标准中禁止它的原因。
【问题讨论】:
标签: c++