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

标签 c++ c++11 polymorphism standards access-specifier

考虑以下代码片段。

Sayhi() 方法在 Base 类中具有公共(public)访问权限。

Sayhi() 已被 Derived 类重写为私有(private)方法。

通过这种方式,我们可以侵犯某人的隐私,而 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?

该标准根本没有关于警告的内容;它只是定义了格式良好的代码的行为。由编译器编写者决定哪些警告可能有用;并警告所有私有(private)覆盖,以防万一您不希望它们被覆盖,这听起来会产生很多误报。

关于c++ - 侵犯隐私 - C++ 标准如何处理它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16107861/

相关文章:

c++ - 寻找更好的C++类工厂

c++ - 作业 : Array's for C++

c++ - P2P 连接的 NAT 穿越实现

c++ - cpp文件中的C++变量能否定义为特殊符号β

c++ - 如何从打开的窗口列表中检索 QWidget

c++ - 使用 std::tuple 构建基于 vector 的数据集请引用 variadic-templates

c++ - 如何在 C++ 程序中包含流程工具?

c++ - 家长访问 child 私有(private)/ protected

Haskell隐式字符串多态性

c++ - 如何调整动态分配的多态对象数组的大小?