如果在子类中将虚方法声明为 virtual 是否有任何区别?

Does it make any difference if a virtual method is declared virtual in the subclass?

我经常看到代码(例如 here),即使 class 不打算再次被子classed,覆盖也被声明为虚拟的。例如。

class A {
    virtual void foo();
}
class B : public A {
    virtual void foo();
}
// there is no subclass of B (and most likely there will never be one)

以我幼稚的 C++ 初学者的想法,我发现不声明 B::foo virtual 更清楚、更明确,以防它不打算被覆盖。 IE。

class B : public A {
     void foo();
}

我写的很多方法并不意味着被覆盖。另一方面,我理解 virtual 表示该方法旨在被覆盖。我想这只是个人喜好问题,但我不是 100% 确定:

如果 B::foo() 被声明为 virtual(假设 B 不会被用作基础 class)有什么区别吗?

不,这没有任何区别。如果 A::foo 在基础 class 中声明为 virtual,则 B::foo 也是虚拟的:无论您是否声明它。

不需要在派生 class 中标记重写的虚拟方法 virtual。一个方法是否是虚拟的决定是在最小派生中做出的class.

但是,在派生的 class 中显式标记虚方法 virtual 是个好主意,原因有两个:

  1. 它可以作为您代码的未来读者的文档。那可能是你,所以这应该是一个强有力的激励。
  2. 如果有人决定删除基础 class 中的 virtual 限定符,编译器可以在应用程序发布之前捕获错误,并发出警告。不过,在这种情况下,不需要特定的实现来发出诊断。


如果您的编译器支持 C++11,建议在派生的 classes 中使用 override specifier,因为它会执行额外的验证。如果基 class 方法未声明 [​​=10=],但派生 class 使用 override 说明符,则实现需要发出错误。

A 方法不丢失 is virtual 限定符,因此如果 A::foo() 是虚拟的,即使不重复 [=12] 中的关键字,B::foo() 也是 virtual =]声明。

override之前,可能是派生classes中重复virtual的样式要记住是重写的方法,现在我们可以用override相反(并且编译器检查它是否正确,而它不能简单地使用 virtual

Many methods I write are not meant to be overridden

因此您可以将它们标记为 final 以禁止重写该方法(如果有意义,您也可以将 class 标记为 final)。