侵犯隐私 – C标准如何处理它?

请考虑以下代码段.

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?

该标准根本没有任何关于警告的说法;它只是定义了格式良好的代码的行为.编译器编写者可以决定哪些警告可能有用;并且警告所有私人覆盖,以防万一你并不意味着它们会覆盖它听起来会产生很多误报.

上一篇:c – 缓存优化和多态性


下一篇:Java:参数化Map对象