6

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

そこの上位2つの回答から、それを達成するには2つの方法があることに気付きました。

  • デストラクタを純粋仮想にします。
  • コンストラクターを保護します。

2つのアプローチの違いを知りたいです。どちらか一方を優先する必要があるシナリオはありますか (または、一方が機能するが他方が機能しないという特別な状況もあります)? 私はそれについて考え、何も考えることができませんでした。

ここでいくつかの投稿の回答を検索しました ( Is there a use for Making a protected destructor virtual? , C++: Protected Class Constructor , Should an abstract class' destructor be pure virtual? ) 何かをまとめようとしましたが、できませんでした結論を出します。

4

2 に答える 2

3

主な違いは

Base * ptr = new Derived;
delete ptr;

仮想デストラクタがあれば合法ですが、それがなければ UB になります。またdynamic_cast、少なくとも 1 つの仮想機能が必要です。
したがって、ポリモーフィックな動作が必要な場合は、(純粋な) 仮想デストラクタを使用してください。必要ない場合は、保護されたコンストラクターを使用し、ポリモーフィズム (vtables) のオーバーヘッドを支払わないでください。ただし、デストラクタも保護されていると宣言して、ベースポインタを介した削除を防ぎます。

于 2012-12-05T10:26:06.517 に答える
3

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

于 2012-12-05T09:23:57.043 に答える