override 关键字强制编译器检查重写合法性:先查找基类虚函数,再比对签名(含 const、引用限定符),最后验证协变返回类型;任一失败即报错,且仅限类内声明末尾使用。

不加 override,编译器不会检查你是不是真在重写——它默认你只是想定义个新函数。
为什么 override 一加就报错?
因为编译器真正在做三件事:找基类虚函数、比对签名、验证协变规则。只要其中任一环节失败,override 就会让编译直接终止。
- 找不到同名虚函数(比如拼错函数名、基类没声明
virtual)→ 报error: 'xxx' does not override a base class member - 参数类型差一个
const或&→ 签名不匹配,不算重写 - 基类是
virtual void draw() const,子类写成void draw()→ 缺少const,override拒绝通过 - 返回类型不满足协变:基类返回
Base*,子类返回Derived(非指针/引用)→ 编译失败
override 只能用在函数声明末尾,且仅限类内
它不是修饰符,不能放在返回类型前,也不能出现在 .cpp 文件的函数定义里。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- ✅ 正确:
void update(float dt) const override;(在类定义中,.h里) - ❌ 错误:
override void update(float dt);(位置错) - ❌ 错误:
void Derived::update(float dt) const override { ... }(.cpp中定义时加override是非法的) - ❌ 错误:用于静态函数、构造函数、析构函数、非虚函数——语法上就不允许
引用限定符(& / &&)必须一致
C++11 起,虚函数可以带左值或右值引用限定;一旦基类函数写了 void func() &,子类也必须带 & 才能用 override。
- 基类:
virtual void serialize() &&; - 子类:
void serialize() && override;✅ - 子类:
void serialize() override;❌(缺少&&,签名不匹配) - 这个细节极易被忽略,尤其在移动语义介入后,不写限定符就等于签名不同
最常被低估的是 const 和引用限定符的严格性——它们不是“风格问题”,而是签名的一部分。哪怕只漏一个 const,override 就会拦住你,而不是等运行时才发现多态没生效。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










