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

时间:2016-07-20 21:12:11

标签: c++

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

例如:

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 个答案:

答案 0 :(得分:3)

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

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

这是c ++的基本概念。您可以阅读here(以及许多其他地方)。

答案 1 :(得分:0)

你的“Aa”析构函数不是虚拟的,所以你观察的是预期的行为。

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