c++ override关键字详解

Posted by CongYu on October 1, 2020

C++ override 关键字

基本概念

override 是 C++11 引入的关键字,用于显式地标记派生类中重写基类虚函数的成员函数。它可以帮助编译器检查函数重写是否正确,提高代码的可读性和安全性。

使用场景

  1. 虚函数重写:
    • 当派生类需要重写基类的虚函数时,确保函数签名与基类完全匹配
  2. 接口实现:
    • 实现纯虚函数时,确保正确实现了所有必要的接口

优点

  1. 编译时检查:
    • 确保函数签名与基类完全匹配
    • 避免因拼写错误或参数不匹配导致的问题
  2. 代码可读性:
    • 明确表示这是对基类函数的重写,使代码意图更清晰
  3. 维护性:
    • 当基类函数签名改变时,编译器会提示需要更新派生类
    • 减少运行时错误

注意事项

  1. 使用条件:
    • 只能用于虚函数
    • 基类必须有对应的虚函数声明
  2. 常见错误:
    • 函数签名不匹配(参数类型、数量、const 修饰等)
    • 基类函数不是虚函数
    • 忘记在派生类中实现纯虚函数
  3. 最佳实践:
    • 总是使用 override 标记重写的虚函数
    • 保持基类和派生类函数签名完全一致
    • 注意 const 修饰符的匹配

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Base {
public:
    virtual void foo() = 0;  // 纯虚函数
    virtual void bar() { std::cout << "Base::bar" << std::endl; }
    virtual ~Base() = default;
};

class Derived : public Base {
public:
    // 正确使用 override
    void foo() override { std::cout << "Derived::foo" << std::endl; }
    void bar() override { std::cout << "Derived::bar" << std::endl; }
    
    // 错误示例:函数签名不匹配,编译器会报错
    // void foo(int) override { }  // 错误:没有匹配的基类函数
};

class AnotherDerived : public Base {
public:
    // 没有使用 override,如果函数签名错误,编译器不会报错
    void foo(int) { }  // 错误:没有实现基类的纯虚函数,但编译器不会提示
};