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.
我没有明确指出的任何内容都允许这样做,但是覆盖规则并不能阻止它.它可以通过虚拟功能和功能覆盖现有而不允许这种情况.
如果你问为什么这就是语言,你可能不得不问标准化委员会.
标签:method-overriding,c,oop,virtual-functions,private-members 来源: https://codeday.me/bug/20190910/1798989.html