C++如何正确继承基类并重写虚函数?SDL2开发遇基类未定义报错
问题原因及修复方案
1. 基类未定义报错
该问题90%以上是头文件循环引用导致的:你在GameObj.h中引入了Game.h,如果Game.h中又反过来引入了GameObj.h或者Player.h,就会形成引用死循环,编译时GameObj还没完成定义就被Player读取,触发未定义报错。
修复方法:
- 检查
Game.h的头文件引入逻辑,如果Game.h中仅用到GameObj/Player的指针或引用,不需要完整类定义,直接在Game.h中加前置声明即可,不需要引入对应的头文件:
class GameObj; class Player;
- 把
Game.h中对GameObj.h、Player.h的引用移到Game.cpp中,打破循环引用链。
2. 虚函数不存在报错
该报错一般是基类未定义的衍生问题,解决完循环引用后如果还存在,检查两个配置项:
- 确认你的编译器开启了C11及以上标准支持,
override关键字是C11新增特性,老标准下无法识别,会误判为你要定义新函数而非重写父类虚函数。GCC/Clang编译时加上-std=c++11(或更高的c++17/c++20)参数即可,Visual Studio在项目属性的C++语言标准选项中调整即可。 - 检查虚函数的签名是否完全一致,你当前代码中
update函数的返回值、参数列表都和父类纯虚函数匹配,不需要调整。
额外优化建议
你Player类中单独定义的x、y成员可以直接复用父类protected修饰的dstR.x、dstR.y,不需要额外存储两份位置数据,避免后续开发中出现两边值不一致的逻辑问题。
内容的提问来源于stack exchange,提问作者Phandal
相关产品推荐
相关产品推荐

