override与final关键字的作用与最佳实践
请说明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;
最佳实践:
- 所有派生类中意图重写的虚函数都应加override(IDE可自动生成)。
- 设计为不可继承的类标记final,便于编译器优化(去虚拟化)。
- final函数允许编译器进行更多去虚拟化优化(devirtualization)。