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

继承类开发遭遇符号查找错误(未解析外部符号):纯虚析构未实现

解决纯虚析构函数导致的未解析外部符号问题

你遇到的是纯虚析构函数未提供定义引发的链接错误,这是C++抽象类开发里很容易踩的一个坑!

先看你代码里的核心问题:基类Foo声明了纯虚析构函数virtual ~Foo() = 0;,但没有给出对应的定义。虽然普通纯虚函数不需要实现,但析构函数是特殊的——当派生类对象销毁时,会逐层调用基类的析构函数,哪怕基类析构是纯虚的,也必须有实现,否则链接器会找不到这个符号。

修正后的完整代码

#include <iostream>

class Foo {
public:
    virtual void print() = 0;
    virtual ~Foo() = 0; // 纯虚析构的声明
};

// 必须为纯虚析构提供定义!
Foo::~Foo() {}

class Bar : public Foo {
public:
    Bar() { std::cout << "Bar()\n"; }
    virtual void print() { std::cout << "Bar->print\n"; }
    virtual ~Bar() { std::cout << "~Bar()\n"; }
};

int main() {
    Foo* ptr = new Bar();
    ptr->print();
    delete ptr; // 这里会先调用Bar的析构,再调用Foo的析构
    return 0;
}

关键原因解释

  • 析构函数的调用链是强制的:销毁派生类对象时,编译器会自动插入基类析构函数的调用逻辑,不管基类析构是不是纯虚的。
  • 纯虚析构的作用是把基类标记为抽象类(无法直接实例化),但它本身依然是一个需要被调用的函数,因此必须提供定义来满足链接阶段的符号查找需求。

如果不补充纯虚析构的定义,链接器就会抛出类似unresolved external symbol "public: virtual __thiscall Foo::~Foo(void)"的错误,这正是你当前碰到的问题。

内容的提问来源于stack exchange,提问作者Karim Abdel Hamid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:26:57