不能。派生类重写虚函数时,override 和 virtual 不能同时使用:override 已隐含虚函数语义,virtual 冗余且破坏意图清晰性;二者语义层级不同,virtual 用于基类开启多态,override 用于派生类声明并验证重写。

override 和 virtual 能不能一起写在派生类函数上?
不能。在派生类中重写虚函数时,override 和 virtual 不能同时出现——加 override 就够了,加 virtual 属于冗余且不推荐。
原因很简单:override 本身已隐含“这是虚函数”的语义,编译器会强制检查它是否真在重写基类的虚函数;而 virtual 在派生类里对已有虚函数再加一次,既无新作用,又破坏意图表达的清晰性。
-
virtual只应在基类中用于“开启”虚函数机制 -
override只应在派生类中用于“声明并验证”重写行为 - 两者语义层级不同:一个定义多态起点,一个确认多态延续
为什么有人会想同时写?常见误解来源
看到基类用 virtual、自己照搬写法,或误以为“加 virtual 更保险”,结果写出类似这样的代码:
class Derived : public Base {
public:
virtual void func() override { ... } // ❌ 不必要,且 clang/gcc 都会警告 -Wduplicate-decl-specifier
};
这不是语法错误(C++ 标准允许这种冗余),但现代编译器普遍报 warning,而且团队代码审查通常会拒绝。更关键的是,它模糊了设计意图:你是在“声明虚函数”,还是在“确认重写”?二者不该混在同一处。
立即学习“C++免费学习笔记(深入)”;
override 不生效的典型场景(容易被忽略)
即使写了 override,也不代表一定重写成功。以下情况会让 override 失效或触发编译错误:
- 基类函数没加
virtual(哪怕有同名函数,override也会直接报错) - 参数类型/数量/const 限定不一致(比如基类是
void f() const,派生类写成void f()) - 返回类型不满足协变规则(如基类返回
Base*,派生类返回int*) - 多继承下两个基类都有同签名虚函数,未显式指定用哪个(编译器报二义性)
这些错误只有加了 override 才会在编译期暴露;不加的话,函数只是“隐藏”而非“重写”,运行时行为可能完全不符合预期。
final 和 override 一起用是合法且常见的
和 virtual 不同,final 和 override 可以共存,表示“我重写了这个虚函数,且禁止下游再重写”:
void render() const override final { ... }
注意顺序:override 必须在 final 前(语法要求),且三者 const/override/final 的位置有固定约束。漏掉 const 或放错顺序,编译直接失败。
真正容易踩的坑不在语法层面,而在签名一致性——尤其是 const、&/&& 限定符、noexcept、返回类型的协变细节。这些地方一旦出错,override 会立刻拦住你,但前提是,你得先写上它。


















