考虑以下代码片段。
Sayhi() 方法在 Base 类中具有公共(public)访问权限。
Sayhi() 已被 Derived 类重写为私有(private)方法。
通过这种方式,我们可以侵犯某人的隐私,而 C++ 无法检测到它,因为事情发生在运行时。
我理解这是“纯粹”的编译时检查。但是当使用一些厚继承层次结构时,程序员可能会错误地更改访问说明符。标准不应该至少有一些发言权吗?某种警告信息。
为什么当重写函数或虚函数的访问说明符不同时,编译器至少不会发出警告消息?
Q1。 C++ 标准对此类运行时异常有任何说法吗?
Q2。我想从 C++ 标准的角度理解,为什么标准不强制编译器实现者进行警告诊断?
#include <iostream>
class Base {
public:
virtual void Sayhi() { std::cout<<"hi from Base"<<std::endl; }
};
class Derived : public Base
{
private:
virtual void Sayhi() { std::cout<<"hi from Derived"<<std::endl; }
};
int main() {
Base *pb = new Derived;
// private method Derived::Sayhi() invoked.
// May affect the object state!
pb->Sayhi();
return 0;
}
最佳答案
Does C++ standard has any say about such run-time anomalies?
没有。访问控制纯粹是编译时的,影响可以使用哪些名称,而不是可以调用哪些函数。
因此在您的示例中,您可以访问名称 Base::Sayhi
,但不能访问 Derived::Sayhi
;并访问 Base::Sayhi
允许您几乎调用覆盖它的任何函数。
Why wouldn't standard enforce compiler implementors to have warning diagnostics?
该标准根本没有关于警告的内容;它只是定义了格式良好的代码的行为。由编译器编写者决定哪些警告可能有用;并警告所有私有(private)覆盖,以防万一您不希望它们被覆盖,这听起来会产生很多误报。
关于c++ - 侵犯隐私 - C++ 标准如何处理它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16107861/