我正在用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
}
你应该让Aa
的析构函数是虚拟的:
class Aa {
public:
virtual ~Aa();
};
这是c的一个基本概念。你可以在这里(和许多其他地方)阅读它。
您的“Aa”析构函数不是虚拟的,因此您观察到的是预期的行为。
要获得您期望的行为,请将析构函数声明为虚拟~Aa()=默认;
。