C++重写父类虚函数时object file出现LNK2001链接错误如何解决?
报错原因与修复方案
核心报错原因
你遇到的LNK2001未解析外部符号错误,是两处代码编写不规范共同导致的:
- 类成员函数实现未加作用域限定符:你在AGAM.cpp、TUI.cpp中写的
getHardwareName都是独立的全局函数,不属于AGAM、TUI类的成员。链接器找不到头文件中声明的AGAM::getHardwareName虚函数的实现,就会抛出该错误。 - 父类实现返回值非法:
std::string类型不能直接接收NULL(空指针常量),即便链接通过,运行时也会触发字符串构造异常崩溃。
修复步骤
1. 修复父类AGAM的实现
修改AGAM.cpp代码,加上类作用域限定符,同时调整返回值为合法空字符串:
//----------- Parent cpp file ---------------------------- std::string AGAM::getHardwareName() // 加AGAM::标记属于父类的成员函数 { return ""; // 替换NULL为空字符串 }
如果你后续不需要父类的getHardwareName有默认实现,可以直接在AGAM.h中将其声明为纯虚函数:virtual std::string getHardwareName() = 0;,但要注意该操作会让父类变成抽象类,无法实例化,不符合你需求的话不用修改声明。
2. 修复子类TUI的声明与实现
首先修改TUI.h的声明,增加override关键字(C++11及以上版本支持),显式标记该函数是重写父类的虚函数,编译期即可提前检查重写合法性:
//-------------- child class header file --------- std::string getHardwareName() override; //child class override
再修改TUI.cpp的实现,加上子类的作用域限定符:
//--------------- child class cpp file ---------- std::string TUI::getHardwareName(){ // 加TUI::标记属于子类的成员函数 return mBoardName; }
修改完成后重新编译即可解决链接报错。
内容的提问来源于stack exchange,提问作者MacLCM
相关产品推荐
相关产品推荐

