C++11——显式虚函数重写
提出问题:
struct Base {
virtual void some_func();
};
struct Derived : Base {
void some_func(); //重写
};
Derived::some_func
的真实意图??
真的重写?意外写了同名的函数?基类中加了相同的签名的虚函数?
当基类中的虚函数签名被修改,子类将无法重写该虚函数。如果子类为修改,运行期将不会正确调用该虚函数的正确的实现。
解决方案:
struct Base {
virtual void some_func(float);
};
struct Derived : Base {
virtual void some_func(int) override; // 错误
virtual void some_func(float) override; // OK
};
编译器会检查基类中的虚函数,和派生类中带有override
的虚函数有没有相同的函数签名。
如果不存在,就会报错。
C++ 11也提供 final
,避免类被继承或基类的函数被改写。
struct Base1 final { };
struct Derived1 : Base1 { }; // 错误
struct Base2 {
virtual void f() final;
};
struct Derived2 : Base2 {
void f(); //错误
};
总结:
- 在派生类重写基类虚函数应该显示使用
override
,避免重写基类中不存在的虚函数,在编译期检查到错误。 - 如果禁止重写基类虚函数,在基类虚函数明确添加
final
。 - 一旦一个类的成员函数被声明为虚函数,那要么被重写要么被禁止重写,永远无法覆盖。