C++ final 关键字
基本概念
final 是 C++11 引入的关键字,用于:
- 禁止类被继承
- 禁止虚函数被重写
使用场景
- 类级别 final:
- 当类不应该被继承时
- 例如:工具类、单例类等
- 函数级别 final:
- 当虚函数不应该被进一步重写时,确保特定实现不被修改
优点
- 设计意图明确:
- 明确表示类或函数不应该被继承或重写
- 防止意外的继承或重写
- 性能优化:
- 编译器可以对 final 类或函数进行更好的优化
- 可能消除虚函数调用的开销
- 安全性:
- 防止关键实现被修改
- 确保类的设计不被破坏
注意事项
- 使用时机:
- 谨慎使用 final,因为它限制了代码的扩展性
- 只在确实需要防止继承或重写时使用
- 最佳实践:
- 对工具类、单例类等使用类级别 final
- 对关键实现使用函数级别 final
- 保持代码的可扩展性
示例代码
类级别 final
1
2
3
4
5
6
7
8
// 类级别 final
class Base final {
public:
virtual void foo() { std::cout << "Base::foo" << std::endl; }
};
// 错误:不能继承 final 类
// class Derived : public Base { }; // 编译错误
函数级别 final
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 函数级别 final
class Base2 {
public:
virtual void foo() final { std::cout << "Base2::foo" << std::endl; }
virtual void bar() { std::cout << "Base2::bar" << std::endl; }
};
class Derived2 : public Base2 {
public:
// 错误:不能重写 final 函数
// void foo() override { } // 编译错误
// 可以重写非 final 函数
void bar() override { std::cout << "Derived2::bar" << std::endl; }
};