私はC++でオペレーティングシステムを作成しています。私は私の処分で標準ライブラリを持っていないので(これは標準ライブラリで正常に動作するかどうかはわかりません)。オブジェクトdelete
がオブジェクトであれば、変数型のデストラクタ(およびその親オブジェクト)のみを呼び出すように見えます。例えばC++デストラクタが意図したとおりに動作しない
:
Aa* aa = new Bb();
delete aa;
は "AAを破壊" 印刷します。一方、「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
}
'virtual'キーワードはどこか忘れていませんか? –
「私がここで欠けているものはありますか?」 - はい。 'virtual'デストラクタは、ベースオブジェクトポインタを介して削除するときに使用します。 –