继承类开发遭遇符号查找错误(未解析外部符号):纯虚析构未实现
解决纯虚析构函数导致的未解析外部符号问题
你遇到的是纯虚析构函数未提供定义引发的链接错误,这是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
相关产品推荐
相关产品推荐

