問題のシナリオは次のとおりです。オブジェクトが破棄される直前に呼び出す必要のあるCleanup()仮想メソッドを含むC++オブジェクトがあります。正しいことを行うために、このCleanupメソッドは完全に形成されたオブジェクト(サブクラスデータを含む)にアクセスする必要があるため、自分のクラスのデストラクタの開始時にCleanup()を呼び出すことはできません。デストラクタが呼び出され、サブクラスがすでに完了しているデストラクタは、Cleanup()が確認する必要のあるデータをすでに解放している可能性があります。
明らかな解決策は、オブジェクトを削除する前に、呼び出し元のコードに手動でルーチンを呼び出すように要求することです。
theObject->Cleanup();
delete theObject;
しかし、遅かれ早かれ誰か(おそらく私)がCleanup()を呼び出すのを忘れ、悪いことが起こるので、その解決策は壊れやすいです。
別の解決策は、クラスをラップするpImplテクニックを実装する「ホルダー」オブジェクトを用意し、オブジェクトを削除する前に、ホルダーオブジェクトのデストラクタがオブジェクトに対してCleanup()を呼び出すようにすることです。ただし、このソリューションは、クラスの動作が標準のC ++クラスとは異なり、スタック上または静的にオブジェクトを割り当てることができないため、100%望ましいものではありません。
したがって、問題は、最初のサブクラスデストラクタを呼び出す前に、オブジェクトで指定された(おそらく仮想)メソッドを自動的に呼び出すようにコンパイラに指示するために使用できる巧妙な手法(C++またはC++ 11のいずれか)がありますか?
(考えてみると、最後のサブクラスコンストラクターが完了した直後にInit()メソッドを自動的に呼び出すための同様のメカニズムも便利な場合があります)