考虑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
?
答案 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}}关键字更可取。