【发布时间】:2013-04-13 00:54:59
【问题描述】:
考虑下面的代码 sn-p。
方法 Sayhi() 在 Base 类中具有公共访问权限。
Sayhi() 已被 Derived 类重写为私有方法。
通过这种方式,我们可以侵入某人的隐私,而 C++ 无法检测到它,因为事情发生在运行时。
我知道这是“纯粹的”编译时检查。但是当使用一些厚继承层次时,程序员可能会错误地更改访问说明符。标准不应该至少有发言权吗?某种警告信息。
为什么当覆盖或虚函数的访问说明符不同时,编译器至少不会发出警告消息?
第一季度。 C++ 标准对这种运行时异常有什么看法吗?
第二季度。我想从 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;
}
【问题讨论】:
-
这不是侵犯隐私,您的
Derived是Base,因此该功能可用(至少通过Base接口)
标签: c++ c++11 polymorphism standards access-specifier