2012-12-05 14 views
6

抽象基本クラスはメンバ変数(ただしメンバメソッドはありません)のみを保持するクラス継承構造をセットアップする必要があります。メンバーメソッドは、派生クラスによって定義されます。そこで、私が必要とすると、このポストである:保護されたコンストラクタと純粋な仮想デストラクタ

私は2つのアプローチの違いを知りたいと思っています。シナリオは、他のシナリオよりも優先されるべきか(あるいは、あるシナリオでは動作するが、他は動作しないような特殊なシナリオがありますか)?私はそれについて考え、何も考えられませんでした。

いくつかの記事(Is there a use for making a protected destructor virtual?C++: Protected Class ConstructorShould an abstract class' destructor be pure virtual?)の回答を検索して何かをまとめてみましたが、結論に至ることはできませんでした。

答えて

3

主な違いは、UBがあるでしょうそれなしで、合法的である仮想デストラクタで

Base * ptr = new Derived; 
delete ptr; 

です。また、dynamic_castには少なくとも1つの仮想関数が必要です。
多態的な振る舞いが必要な場合は、(純粋な)仮想デストラクタを使用してください。あなたがそれを望まないなら、保護されたコンストラクタを使い、多態性(vtables)のオーバーヘッドを支払わないでください。しかし、デストラクタを保護して宣言し、ベースポインタによる削除を防ぎます。

+1

これはOPの質問に*本当に*答えるものではありません。保護されていない仮想デストラクタを保護されたコンストラクタのケースで使用すると、サンプルコードで定義された動作が行われます。あなたは、関連しているが直面している問題について話している。 –

3

どちらの方法も、全く異なるメカニズムを利用して、望ましい効果を達成します。私の意見では、protected constructorはあなたの問題の説明に正確に対応するので、より表現力があります。 Pure virtual destructorは自然な解決策ではなく、その目的を説明するために追加のドキュメントが必要な場合があります。スキップされた可能性がある場合でも、デストラクタを実装するようにサブクラスを強制します。

+0

派生クラスにデストラクタを明示的に実装していないと、自動的に生成されたデストラクタで十分です。したがって、純粋な仮想デストラクタは、デストラクタを実装するためにサブクラスに強制しません。 – Wutz

+0

@Wutz、その目的は何ですか? –

+0

@Michael Krelin - ハッカー:純粋な仮想メソッドなしで基本クラスの抽象化を行う。基本クラスが仮想メソッドのデフォルトの実装を定義し、それが直接的にインスタンス化されないようにするのに便利です。 – Wutz

関連する問題