You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:18:01