C++ override 关键字
基本概念
override 是 C++11 引入的关键字,用于显式地标记派生类中重写基类虚函数的成员函数。它可以帮助编译器检查函数重写是否正确,提高代码的可读性和安全性。
使用场景
- 虚函数重写:
- 当派生类需要重写基类的虚函数时,确保函数签名与基类完全匹配
- 接口实现:
- 实现纯虚函数时,确保正确实现了所有必要的接口
优点
- 编译时检查:
- 确保函数签名与基类完全匹配
- 避免因拼写错误或参数不匹配导致的问题
- 代码可读性:
- 明确表示这是对基类函数的重写,使代码意图更清晰
- 维护性:
- 当基类函数签名改变时,编译器会提示需要更新派生类
- 减少运行时错误
注意事项
- 使用条件:
- 只能用于虚函数
- 基类必须有对应的虚函数声明
- 常见错误:
- 函数签名不匹配(参数类型、数量、const 修饰等)
- 基类函数不是虚函数
- 忘记在派生类中实现纯虚函数
- 最佳实践:
- 总是使用 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) { } // 错误:没有实现基类的纯虚函数,但编译器不会提示
};