为什么必须将"virtual"放入基类中,而不是仅在子类中使用"override"?在C++

why do you have to put "virtual" into the base class instead of just using the "override" in children? in C++

本文关键字:子类 C++ override virtual 为什么 基类      更新时间:2023-10-16

标题几乎说明了一切。 为什么需要在基类中定义将来可能会覆盖函数?

这样,如果你想从基类派生一个行为不同的版本,你必须修改基类,并且你还没有考虑基类中的那个特定函数来标记虚拟。

据我所知,你通过使用覆盖来解决java中的这种抽象定义(尽管到目前为止我只关注Java)对我来说似乎更自然。c++中的这种扭曲是为了迫使程序员提前思考,还是有技术原因为什么它像这样工作?

这样做是为了使成员函数成为虚拟的决定仍由基类决定。

决定使函数虚拟会对设计产生影响:如果你使函数虚拟,你必须考虑它做不同事情的可能性。相反,您可以指望非虚函数保持不变。

允许override"从外部"强制虚拟可能会打破函数编写者的假设。此外,这将使单独的编译复杂化,C++因为编译器必须为虚拟函数做一些没有为非虚拟函数做的其他事情,例如从 vtable 或用于实现虚拟调度的其他机制中查找有效地址。

相反,在 Java 中,所有公共实例和受保护实例方法都是虚拟的,除非您将它们定为最终方法。C++没有走这条让类设计完全没有虚函数的路线。Java没有这个选项,因为所有类都继承Object,而C++允许你使类尽可能轻量级。

如果元类进入C++20,您可以随时使用"接口" (观看视频)