1

私は言うテンプレートリストを持っています、

List<SuperClass*>* mList;

for(int i = 0;i < mList->ElementsCount();i++)
    mList->DeleteElementAtIndex(i);

サブクラスの mList オブジェクトに追加されます。

リストからオブジェクトを削除する際に、オブジェクトを対応するサブクラスに変換し、delete メソッドを呼び出す必要がありますか?

4

1 に答える 1

3

いいえ、明示的な変換なしで各ポインターで演算子を呼び出すdeleteだけで十分ですが、クラス階層内のクラスのデストラクタが次のように宣言されていることを確認する必要がありますvirtual(基本クラスの 1 つだけをそのようにマークするだけで十分です)。このように、デストラクタへの呼び出しは仮想呼び出しになるため、正しいデストラクタが呼び出されます。

デストラクタを仮想として宣言しない場合、delete各ポインタを呼び出すときに、正しいデストラクタではなく基本クラスのデストラクタが呼び出されます。virtualこれが、デストラクタのないクラス階層を持つことがほとんどの場合エラーと見なされる理由です。

これについての詳細は、C++ FAQ Liteの関連エントリを参照してください。

ところで、そのリストは STL リスト ( std::list) ではないようです。そうであれば、質問から STL タグを削除する必要があります。

于 2010-09-22T10:41:49.390 に答える