提问者:小点点

C析构函数未按预期工作[重复]


我正在用C编写一个操作系统。我没有std库(所以我不确定这是否适用于std库)。似乎如果我删除一个对象,它只调用变量类型的析构函数(以及它的父级)。

例如:

Aa* aa = new Bb();
delete aa;

只会打印“销毁Aa”。然而

Bb* bb = new Bb();
delete bb;

将同时打印“销毁Bb”和“销毁Aa”。

我试图通过调用超类析构函数中的子类析构函数来解决这个问题(如下所示)。

我在这里遗漏了什么,还是必须在初始delete之前诉诸于转换为具体类型?

class Aa {
public:
    ~Aa();
};
class Bb : public Aa {
public:
    ~Bb() {
        log("destructing Bb");
    }
};

Aa::~Aa() {
    log("destructing Aa");

    // TODO checks if we are of type Bb
    // ((Bb*) this)->~Bb(); // uncomment to test calling sub class destructor
}

共2个答案

匿名用户

你应该让Aa的析构函数是虚拟的:

class Aa {
public:
    virtual ~Aa();
};

这是c的一个基本概念。你可以在这里(和许多其他地方)阅读它。

匿名用户

您的“Aa”析构函数不是虚拟的,因此您观察到的是预期的行为。

要获得您期望的行为,请将析构函数声明为虚拟~Aa()=默认;