受保护成员辅助功能额外签入C++的原因是什么?
What's the reason for protected member accessibility additional check in 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++标准费心通过基类指针限制访问受保护的成员?
不重复到:访问派生类中的受保护成员,我想询问在标准中禁止它的原因。
仅仅因为您从Base
派生并不意味着您应该被允许访问从Base
派生的任何其他类的受保护成员。想象一个类Derived2
由一个从Base
继承的库提供的。这样,您将能够获得Derived2
的基本对象,并在Derived
代码中对其进行任何操作。
所以基本上,该标准确保你只修改你继承的受保护成员,而不是弄乱不相关的同级类的完整性。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么