C++抽象类编译报Unresolved External Symbol错误如何解决
错误原因
本次链接错误的核心问题出在基类StoreState的虚函数声明规则上:你在StoreState.h中仅声明了Close、Open、Sell三个非纯虚的虚函数,既没有提供对应的实现,也没有将其标记为纯虚函数。C++规范要求非纯虚的虚函数必须存在实现,否则链接阶段无法为虚函数表填充对应函数地址,就会抛出未解析外部符号错误。
修复方案
有两种可选修复方式,推荐使用第一种适配抽象基类的设计逻辑:
- 方案1:将
StoreState的三个虚函数声明为纯虚函数,明确其抽象基类的定位,不需要基类提供实现。修改后StoreState.h代码如下:
#ifndef STORESTATE_H_ #define STORESTATE_H_ class Store; class StoreState { public: // 末尾加=0标记为纯虚函数 virtual void Close(Store&) = 0; virtual void Open(Store&) = 0; virtual void Sell(Store&) = 0; // 补充虚析构函数,避免派生类销毁时出现内存泄漏 virtual ~StoreState() = default; }; #endif
- 方案2:如果不需要将
StoreState作为纯抽象基类,直接为三个虚函数添加默认空实现即可:
#ifndef STORESTATE_H_ #define STORESTATE_H_ class Store; class StoreState { public: virtual void Close(Store&) {} virtual void Open(Store&) {} virtual void Sell(Store&) {} virtual ~StoreState() = default; }; #endif
额外优化提示
当前派生类ConcreteStateOpened的Close方法中直接对store.State赋值栈上的ConcreteStateOpened对象,会存在对象切片问题,建议调整为用指针/智能指针持有StoreState类型的状态实例,避免多态特性失效。
内容的提问来源于stack exchange,提问作者Philipp Peter
相关产品推荐
相关产品推荐

