使被覆盖的虚函数变为非虚函数的目的

Purpose of making overridden virtual function non-virtual

本文关键字:函数 覆盖      更新时间:2023-10-16

考虑c++ 11中的下列类:

class Base
{
public:
  virtual void foo() = 0;
}
class Sub1 : public Base
{
public:
  virtual void foo() override {};
}
class Sub2 : public Base
{
public:
  void foo() override {};
}

使重写的函数像Sub2那样非虚的结果是什么?

虚函数的重写始终是虚函数,无论它是否声明为虚函数。因此,就语言而言,在Sub2::foo()的声明中有或没有virtual关键字没有任何影响,因为override关键字意味着函数必须覆盖基类的成员函数。源自§10.3[类]虚拟]/p2的标准,重点添加:

如果虚成员函数vf声明在类Base和类Derived,直接或间接派生自Base具有相同名称的成员函数vf,参数类型列表(8.3.5),cv- qualifier和ref-qualifier(或缺少相同的),如Base::vf,那么Derived::vf也是虚的(),不管它是否)并且覆盖 Base::vf。为了方便,我们说任何虚函数都可以覆盖自己。

省略单词virtual并不表示该函数是非虚拟的。它确实减少了冗长,减少了视觉噪音,或者简而言之,减少了源代码文本给人的印象,因为它太冗长了,没有任何特定的部分引入任何真正新的东西来吸引读者的注意力,所以它看起来或多或少像一堆灰色的文本,这当然会导致一些重要的细节被忽视,也就是说,无意中被忽视了。优先使用override关键字