2016-07-20 11 views
-2

私は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 
} 
+3

'virtual'キーワードはどこか忘れていませんか? –

+0

「私がここで欠けているものはありますか?」 - はい。 'virtual'デストラクタは、ベースオブジェクトポインタを介して削除するときに使用します。 –

答えて

3

あなたはAaのデストラクタを仮想にする必要があります。

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

これは、C++の基本的な考え方です。あなたはhere(と他の多くの場所で)それを読むことができます。

+0

std libにアクセスできないので、仮想関数が動作しません。 –

+0

@ chris13524虚脱は標準ライブラリの一部ではありません。言語の不可欠な部分です。 –

+1

'-fno-rtti'フラグを' gcc'に追加しなければなりませんでしたが、今でも 'virtual'が必要です。 –

0

あなたの "Aa"デストラクタは仮想ではないので、あなたが観察しているのは期待される動作です。

を期待するには、デストラクタをvirtual ~Aa() = default;と宣言します。

関連する問題