C++将私有(private)纯虚拟方法覆盖为公共(public)

标签 c++ oop virtual-functions private-members overriding

为什么会这样?

http://coliru.stacked-crooked.com/a/e1376beff0c157a1

class Base{
private:
    virtual void do_run() = 0;
public:
    void run(){
        do_run();
    }
};

class A : public Base {
public:
    // uplift ??
    virtual void do_run() override {}
};


int main()
{
    A a;
    a.do_run();
}

为什么我可以将 PRIVATE 虚拟方法重写为公共(public)方法?

最佳答案

根据https://en.cppreference.com/w/cpp/language/virtual#In_detail覆盖基类的 virtual 成员函数只关心函数名、参数、const/volatile-ness 和 ref 限定符。它不关心返回类型、访问修饰符或您可能期望它关心的其他事情。

链接的引用还特别指出:

Base::vf does not need to be visible (can be declared private, or inherited using private inheritance) to be overridden.

我能找到的任何东西都没有明确允许这样做,但覆盖规则并没有阻止它。由于 virtual 函数和覆盖现有函数而不是不允许这种情况,它是允许的。

如果您要问为什么语言是这样的,您可能需要询问标准化委员会。

关于C++将私有(private)纯虚拟方法覆盖为公共(public),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50722824/

相关文章:

oop - 如何在没有 ORM 和嵌入式 SQL 的情况下设计 Java Web 应用程序

javascript - 为什么开发人员在 JavaScript 中使用 get 和 set 时使用 "_"?

c++ - 一旦满足指定的容量,是否覆盖优先级队列末尾的元素?

c++ - 如何在不创建实例的情况下获取类的方法成员的类型?

c++ - 如何检测 C/C++ 中的机器字长?

ios - 将数据从 View Controller 传递到 NSObject

c++ - 内存有效的方式来代表最短路径?

c++ - 在抽象类中实现纯虚函数——有什么用吗?

c++ - 使用 gmock 更改非虚函数的源代码

java - 为什么所有 java 方法都是隐式可覆盖的?