プログラマーが Pimpl イディオムか純粋仮想クラスと継承のどちらかを選択する理由は何でしょうか。
pimpl イディオムには、各パブリック メソッドに対して 1 つの明示的な追加間接参照とオブジェクト作成のオーバーヘッドが伴うことを理解しています。
一方、純粋仮想クラスには継承実装のための暗黙的な間接参照 (vtable) が付属しており、オブジェクト作成のオーバーヘッドがないことがわかります。
編集: しかし、外部からオブジェクトを作成する場合はファクトリーが必要になります
純粋仮想クラスが pimpl イディオムよりも望ましくないのはなぜですか?
ベストアンサー1
C++クラスを書くときは、それが
値型
値によるコピーでは、ID は重要ではありません。std::map のキーにするのが適切です。たとえば、「文字列」クラス、または「日付」クラス、または「複素数」クラスです。このようなクラスのインスタンスを「コピー」することは理にかなっています。
エンティティタイプ
アイデンティティは重要です。常に参照によって渡され、「値」によって渡されることはありません。多くの場合、クラスのインスタンスを「コピー」することはまったく意味がありません。意味がある場合は、通常、多態的な「クローン」メソッドの方が適切です。例: Socket クラス、Database クラス、「ポリシー」クラス、関数型言語で「クロージャ」となるもの。
pImpl と純粋な抽象基本クラスはどちらも、コンパイル時の依存関係を減らすための手法です。
ただし、私は pImpl を Value タイプ (タイプ 1) を実装するためにのみ使用し、結合とコンパイル時の依存関係を最小限に抑えたい場合にのみ使用します。多くの場合、面倒な手間をかける価値はありません。正しく指摘されているように、すべてのパブリック メソッドに対して転送メソッドを記述する必要があるため、構文のオーバーヘッドが増えます。タイプ 2 クラスの場合、私は常に、関連するファクトリ メソッドを持つ純粋な抽象基本クラスを使用します。