侵犯隐私- c++标准如何处理它
Intruding privacy - How does the C++ standard handle it?
考虑下面的代码片段。
方法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;
}
c++标准对这种运行时异常有任何规定吗?
。访问控制是纯编译时的,影响可以使用哪些名称,而不是可以调用哪些函数。
在你的例子中,你可以访问名称Base::Sayhi
,但不能访问名称Derived::Sayhi
;并且访问Base::Sayhi
允许您调用覆盖它的任何函数。
为什么标准不强制编译器实现者有警告诊断?
该标准根本没有提到警告;它只是定义了格式良好的代码的行为。由编译器编写者决定哪些警告可能有用;并且警告所有的私有覆盖,以防你不想让它们被覆盖,这听起来会产生很多误报。
访问规范不能放松,只能收紧。Sayhi()
在基类中是public
,所以基本上所有从它派生和覆盖的类都应该期望方法是public
,没有入侵。覆盖函数的访问规范很好地指定了,因为方法一开始就被声明为public
。
尽管你的问题现在已经得到了回答,我还是想补充一点。
虽然您认为这是一个"异常",并希望有诊断,这实际上是有用的:您可以确保您的实现只能被多态使用。派生类应该只有一个公共函数而没有其他公共函数,所有重新实现的成员函数都应该是私有的。
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 处理未处理的异常更改C++
- 使用信号处理程序处理从 FIFO 接收的数据
- 使用QT的C 处理DOM处理后的XML属性顺序
- C++异常处理如何处理异常派生类
- 如何处理信号处理库的输入/输出类型