侵犯隐私- c++标准如何处理它

Intruding privacy - How does the C++ standard handle it?

本文关键字:处理 何处理 c++ 标准 侵犯隐私      更新时间:2023-10-16

考虑下面的代码片段。

方法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

尽管你的问题现在已经得到了回答,我还是想补充一点。

虽然您认为这是一个"异常",并希望有诊断,这实际上是有用的:您可以确保您的实现只能被多态使用。派生类应该只有一个公共函数而没有其他公共函数,所有重新实现的成员函数都应该是私有的。