C++析构函数未按预期工作

C++ destructor not working as intended

本文关键字:工作 析构函数 C++      更新时间:2023-10-16

我正在用C++编写一个操作系统。我没有std-lib可供使用(所以我不确定这是否适用于std-lib)。看起来,如果I delete是一个对象,它只调用变量类型(及其父对象)的析构函数。

例如:

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

将只打印"破坏Aa"。而

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

将同时打印"破坏Bb"answers"破坏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
}

您应该将Aa的析构函数设置为虚拟的:

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

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

您的"Aa"析构函数不是虚拟的,所以您观察到的是预期的行为。

要获得期望的行为,请将析构函数声明为virtual ~Aa() = default;