C++报Undefined Reference to `vtable`错误但已有虚析构函数如何解决?
错误原因
Scene基类中声明的Initialise()、Update()、CloseDown()三个虚函数仅完成了声明,没有提供默认实现。主流C++编译器生成类虚表时,会将虚表输出到该类第一个非内联、非纯虚的虚函数对应的编译目标文件中,由于Scene类缺失这三个虚函数的实现,编译器无法生成完整的虚表,链接阶段就会抛出vtable未定义的错误。
解决方案
根据你的业务设计选择以下任意一种方案即可:
- 方案一:为基类虚函数补全默认实现
你可以直接在头文件的类定义内写内联实现:
// Scene.h中修改对应声明 virtual void Initialise() {} virtual void Update() {} virtual void CloseDown() {}
也可以在Scene.cpp中补充全局实现:
// Scene.cpp中添加以下代码 void Scene::Initialise() {} void Scene::Update() {} void Scene::CloseDown() {}
- 方案二:将基类声明为抽象类
如果Scene本身不需要被实例化,仅作为统一接口定义,直接将三个虚函数声明为纯虚函数即可:
// Scene.h中修改对应声明 virtual void Initialise() = 0; virtual void Update() = 0; virtual void CloseDown() = 0;
补充排查项
如果修改后仍报相同错误,可检查以下两项配置:
- 确认Scene.cpp、MainGame的实现文件都已加入项目编译队列,没有被遗漏参与编译和链接
- 确认
Scene类的定义和实现都被包裹在Engine命名空间下,和MainGame类的继承声明匹配。
内容的提问来源于stack exchange,提问作者Shakier
相关产品推荐
相关产品推荐

