C将私有纯虚方法覆盖为public

为什么会这样?

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虚方法覆盖为公共?

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

链接的参考文件还特别指出:

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

我没有明确指出的任何内容都允许这样做,但是覆盖规则并不能阻止它.它可以通过虚拟功能和功能覆盖现有而不允许这种情况.

如果你问为什么这就是语言,你可能不得不问标准化委员会.

转载注明原文:C将私有纯虚方法覆盖为public - 代码日志