解决基类纯虚析构函数的‘undefined reference’问题
问题分析与解决方案
错误原因
你遇到的链接错误本质是:C++中的纯虚析构函数必须提供定义。当派生类(如Dish)的析构函数被调用时,会自动触发基类(Food)析构函数的调用。即使基类析构函数被声明为纯虚,编译器仍然需要它的定义来完成这个调用流程,否则会抛出"undefined reference"的链接错误。
同时你希望保持Food为抽象类的需求是可以满足的——只要类中存在至少一个纯虚函数,它就是抽象类,纯虚析构函数完全可以充当这个角色。
解决方案
给基类的纯虚析构函数提供一个空定义即可,具体修改如下:
修改后的代码示例
#include <iostream> #include <string> // 补充FoodTypes枚举的定义(假设原代码中已存在) enum FoodTypes { MEAT, VEGETABLE, DESSERT }; class Food { protected: int id; FoodTypes type; std::string name; public: Food(int id, FoodTypes type, std::string name) : id(id), type(type), name(name) {} // 使用初始化列表替代this赋值,更规范 // 声明纯虚析构函数 virtual ~Food() = 0; }; // 为纯虚析构函数提供定义 Food::~Food() {} class Dish: public Food { protected: double cost; public: Dish(int id, FoodTypes type, std::string name, double cost) : Food(id, type, name), cost(cost) {} void display() { std::cout << id << " " << type << " " << name << " " << cost << "\n"; } ~Dish() {} };
现代C写法(C11及以上)
也可以使用default关键字来定义纯虚析构函数,效果与空函数一致,写法更简洁:
// 类内声明 virtual ~Food() = 0; // 类外定义 Food::~Food() = default;
验证效果
修改后:
Food类因包含纯虚析构函数,仍然是抽象类,无法直接实例化- 派生类
Dish的析构函数可以正常调用基类析构函数,链接错误消失
内容的提问来源于stack exchange,提问作者R Karandikar
相关产品推荐
相关产品推荐

