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

解决基类纯虚析构函数的‘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;

验证效果

修改后:

  1. Food类因包含纯虚析构函数,仍然是抽象类,无法直接实例化
  2. 派生类Dish的析构函数可以正常调用基类析构函数,链接错误消失

内容的提问来源于stack exchange,提问作者R Karandikar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:05:37