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

发布时间:2026/10/1 22:11:03
派生类重写基类虚函数(二):override的作用
一、源代码#includeiostream// /*structBase{virtualvoidf(){}};structDerived:Base{voidf()override;};intmain(){Base*pnewDerived;return0;}关于polymorph.cpp:9中void f() override;的说明void f() override;只是函数声明不是函数定义。没有函数体与override没有关系。1. 为什么可以没有函数体C 允许在类中先声明成员函数再在类外定义structDerived:Base{voidf()override;// 声明告诉编译器有这个函数};voidDerived::f()// 定义提供函数体这里不再写 override{std::coutDerived::f()\n;}也可以直接在类内定义structDerived:Base{voidf()override{}// 定义函数体为空表示什么也不做};注意两种写法的区别写法含义void f() override;只有声明还没有提供实现void f() override {}已经提供实现只是函数体为空源代码当前只有声明缺少Derived::f()的定义。下方注释掉的示例使用的是第二种写法所以那里有函数体。2.override的作用是什么override是 C11 引入的说明符意思是“我打算让这个函数重写基类的虚函数请编译器帮我检查。”你的基类在polymorph.cpp:5中定义了virtualvoidf(){}因此派生类的voidf()override;确实重写了基类的虚函数检查通过。如果不小心把参数写错structDerived:Base{voidf(intx)override{}// 编译错误基类中没有对应的虚函数};编译器就会指出问题。如果不写override这个f(int)可以被当作另一个函数不能达到你想重写Base::f()的目的却不一定报错。真正使函数具备虚调用行为的是基类的virtualoverride主要用于检查重写关系、表达意图。正确重写时即使不写override重写关系仍然成立。3. 当前代码能正常生成程序吗不能。我实际编译了当前文件链接阶段出现undefined reference to vtable for Derived原因是main()中执行了Base*pnewDerived;创建Derived对象需要其虚函数表但Derived::f()没有定义因此出现链接错误。即使没有显式调用p-f()这里也会出错。最简单的修正就是把声明改为voidf()override{}总结override负责“检查是否正确重写”不负责生成函数体也不会自动使用基类的函数体。