C++;析构函数未按预期工作 我正在用C++编写一个操作系统。我没有std LIB供我使用(因此我不确定这是否适用于std LIB)。如果我delete一个对象,它似乎只调用变量类型的析构函数(及其父对象)

C++;析构函数未按预期工作 我正在用C++编写一个操作系统。我没有std LIB供我使用(因此我不确定这是否适用于std LIB)。如果我delete一个对象,它似乎只调用变量类型的析构函数(及其父对象),c++,C++,例如: Aa* aa = new Bb(); delete aa; 将只打印“销毁Aa”。鉴于 Bb* bb = new Bb(); delete bb; 将同时打印“销毁Bb”和“销毁Aa” 我试图通过调用超类析构函数中的子类析构函数来解决这个问题(如下所示) 这里是否有我遗漏的东西,或者在开始删除之前,我必须求助于铸造混凝土类型 class Aa { public: ~Aa(); }; class Bb : public Aa { public: ~Bb() {

例如:

Aa* aa = new Bb();
delete aa;
将只打印“销毁Aa”。鉴于

Bb* bb = new Bb();
delete bb;
将同时打印“销毁Bb”和“销毁Aa”

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


这里是否有我遗漏的东西,或者在开始
删除
之前,我必须求助于铸造混凝土类型

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

你是不是忘了某个地方的
虚拟
关键词了?“我这里缺少什么东西了吗”-是的<当通过基本对象指针删除时,代码>虚拟的
析构函数。我没有访问std库的权限,所以虚拟函数不起作用。@chris13524虚拟定义不是std库的一部分,它是语言的组成部分。我必须将
-fno rtti
标志添加到
gcc
中,现在它可以工作了(仍然需要
虚拟
)。