如果在子类中将虚方法声明为 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
是个好主意,原因有两个:
- 它可以作为您代码的未来读者的文档。那可能是你,所以这应该是一个强有力的激励。
- 如果有人决定删除基础 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)。
我经常看到代码(例如 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
是个好主意,原因有两个:
- 它可以作为您代码的未来读者的文档。那可能是你,所以这应该是一个强有力的激励。
- 如果有人决定删除基础 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)。