派生类重写基类虚函数(二):override的作用

一、源代码

cpp 复制代码
#include <iostream>
// /*
struct Base 
{
    virtual void f(){}
};
struct Derived:Base 
{
    void f() override;
};
int main()
{
    Base *p = new Derived;
    return 0;
}
关于 polymorph.cpp:9 中 void f() override; 的说明

void f() override; 只是函数声明 ,不是函数定义。没有函数体,与 override 没有关系。

1. 为什么可以没有函数体?

C++ 允许在类中先声明成员函数,再在类外定义:

cpp 复制代码
struct Derived : Base
{
    void f() override;  // 声明:告诉编译器有这个函数
};

void Derived::f()       // 定义:提供函数体,这里不再写 override
{
    std::cout << "Derived::f()\n";
}

也可以直接在类内定义:

cpp 复制代码
struct Derived : Base
{
    void f() override {}  // 定义,函数体为空,表示什么也不做
};

注意两种写法的区别:

写法 含义
void f() override; 只有声明,还没有提供实现
void f() override {} 已经提供实现,只是函数体为空

源代码当前只有声明,缺少 Derived::f() 的定义。下方注释掉的示例使用的是第二种写法,所以那里有函数体。

2. override 的作用是什么?

override 是 C++11 引入的说明符,意思是:

"我打算让这个函数重写基类的虚函数,请编译器帮我检查。"

你的基类在 polymorph.cpp:5 中定义了:

cpp 复制代码
virtual void f() {}

因此,派生类的:

cpp 复制代码
void f() override;

确实重写了基类的虚函数,检查通过。

如果不小心把参数写错:

cpp 复制代码
struct Derived : Base
{
    void f(int x) override {}  // 编译错误:基类中没有对应的虚函数
};

编译器就会指出问题。如果不写 override,这个 f(int) 可以被当作另一个函数,不能达到你想重写 Base::f() 的目的,却不一定报错。

真正使函数具备虚调用行为的是基类的 virtual;override 主要用于检查重写关系、表达意图。正确重写时,即使不写 override,重写关系仍然成立。

3. 当前代码能正常生成程序吗?

不能。我实际编译了当前文件,链接阶段出现:

复制代码
undefined reference to `vtable for Derived'

原因是 main() 中执行了:

cpp 复制代码
Base *p = new Derived;

创建 Derived 对象需要其虚函数表,但 Derived::f() 没有定义,因此出现链接错误。即使没有显式调用 p->f(),这里也会出错。

最简单的修正就是把声明改为:

cpp 复制代码
void f() override {}

总结 :override 负责"检查是否正确重写",不负责生成函数体,也不会自动使用基类的函数体。

相关推荐
http阿拉丁神猫7 分钟前
Go语言入门笔记:从基础到开发环境搭建(二)
开发语言·笔记·golang
不会就选b1 小时前
C++补充部分(一)--lambda 表达式
开发语言·c++
Pniubi4 小时前
HashMap的扩容和树化边界
java·开发语言
gCode Teacher 格码致知5 小时前
Pandas教学-17:Series与Dataframe的关系
开发语言·python·pandas
发量惊人的中年网工6 小时前
分公司访问总部ERP慢怎么办?SD-WAN组网的排查与验收要点
服务器·开发语言·php
下页、再停留6 小时前
【C#桌面客户端系列学习-15】生成可视化图表之折线图、柱状图、饼状图
开发语言·c#
ShineWinsu6 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
益莱储中国7 小时前
深度解析:RF 实验室从 5G迈向 6G 的过程中保持技术领先与设备升级的路径
开发语言·php
丰色木夕8 小时前
Ubuntu22.04下源码编译安装USD-Brep
c++·ubuntu·nvidia·usd-brep
benchmark_cc8 小时前
Python 量化系统如何设计统一的数据访问接口:从策略解耦到数据层架构
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash