显式虚函数重写
背景说明
在 C++11 之前,C++ 的虚函数机制虽然非常强大,但也带来了一些潜在问题。特别是对于大型代码库,当派生类需要重写基类的虚函数时,可能会因为疏忽而引入错误:
-
拼写错误:如果派生类的函数签名不完全匹配基类的虚函数签名,那么派生类的函数并不会覆盖基类的虚函数,而是会被认为是新的成员函数。
-
基类修改:如果基类修改了虚函数的签名(比如更改了参数类型或数量),派生类中的相应函数将不再覆盖基类的虚函数,但编译器不会发出警告或错误。
这些问题很难被发现,尤其是在运行时表现为未预期的行为时,调试成本极高。
问题示例
以下是一个 C++98 的代码示例,展示了问题的来源:
#include <iostream>class Base {
public:virtual void display() {std::cout << "Base display" << std::endl;}
};class