使被覆盖的虚拟函数非虚拟的目的

时间:2014-07-14 00:18:12

标签: c++ inheritance c++11 override virtual-functions

考虑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

2 个答案:

答案 0 :(得分:11)

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

  

如果在类vf中声明虚拟成员函数Base并且在   从[{1}}直接或间接派生的班级Derived,a   成员函数Base具有相同的名称,参数类型列表(8.3.5),   cv资格和ref {限定符(或不存在)vf   声明,然后Base::vf也是虚拟的(是否是   如此宣布)并且覆盖 Derived::vf。为方便起见,我们说   任何虚函数都会覆盖自己。

答案 1 :(得分:9)

省略单词virtual不会使该功能成为非虚拟功能。它确实减少了详细程度,视觉噪音的数量,或简而言之,源代码文本可以让人产生过于啰嗦的印象而没有任何特定的部分介绍任何可以捕捉读者的新东西#&#注意,这一切都或多或少地像一团灰色的文字,这当然会导致一些重要的细节被忽视,也就是说,无意中被忽视了。 <{1}}关键字更可取。