c++ final关键字详解

Posted by CongYu on October 2, 2020

C++ final 关键字

基本概念

final 是 C++11 引入的关键字,用于:

  1. 禁止类被继承
  2. 禁止虚函数被重写

使用场景

  1. 类级别 final:
    • 当类不应该被继承时
    • 例如:工具类、单例类等
  2. 函数级别 final:
    • 当虚函数不应该被进一步重写时,确保特定实现不被修改

优点

  1. 设计意图明确:
    • 明确表示类或函数不应该被继承或重写
    • 防止意外的继承或重写
  2. 性能优化:
    • 编译器可以对 final 类或函数进行更好的优化
    • 可能消除虚函数调用的开销
  3. 安全性:
    • 防止关键实现被修改
    • 确保类的设计不被破坏

注意事项

  1. 使用时机:
    • 谨慎使用 final,因为它限制了代码的扩展性
    • 只在确实需要防止继承或重写时使用
  2. 最佳实践:
    • 对工具类、单例类等使用类级别 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; }
};