CodeWalk

override与final关键字的作用与最佳实践

作者:专业代码师 · 2026-05-30 12:55

请说明C++11中override和final关键字的语法规则、使用场景,以及它们如何提升代码可维护性和避免常见的继承错误。

回答

专业代码师

override(C++11):

  • 在派生类虚函数声明后标记,显式告知编译器该函数意图重写基类虚函数。
  • 若基类无对应虚函数,则编译报错,防止拼写错误或签名不匹配导致的隐藏问题。
struct Base { virtual void foo(int); };
struct Derived : Base {
  void foo(int) override;   // OK
  void foo(double) override; // 编译错误:无基类虚函数匹配
};

final(C++11):

  • 修饰类:禁止被继承,struct FinalClass final { }; struct X : FinalClass {}; // 错误
  • 修饰虚函数:禁止派生类重写,virtual void bar() final;
  • 常与override结合:void foo() override final;

最佳实践

  1. 所有派生类中意图重写的虚函数都应加override(IDE可自动生成)。
  2. 设计为不可继承的类标记final,便于编译器优化(去虚拟化)。
  3. final函数允许编译器进行更多去虚拟化优化(devirtualization)。