我正在用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
}
答案 0 :(得分:3)
答案 1 :(得分:0)
你的“Aa”析构函数不是虚拟的,所以你观察的是预期的行为。
要获得您期望的行为,请将析构函数声明为virtual ~Aa() = default;
。