请考虑以下代码段.
Sayhi()方法在类Base中具有公共访问权限.
Sayhi()已被类Derived重写为私有方法.
通过这种方式,我们可以侵入某人的隐私,而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?
该标准根本没有任何关于警告的说法;它只是定义了格式良好的代码的行为.编译器编写者可以决定哪些警告可能有用;并且警告所有私人覆盖,以防万一你并不意味着它们会覆盖它听起来会产生很多误报.