編集:おっと!あなたの投稿を読み間違えたので、以下に回答を投稿しました。Boostライブラリは継承よりもコンポジションを使用しているとおっしゃっていたと思いますが、その逆ではありません。それでも、それが誰にとっても役立つのであれば...(私があなたの質問の答えになると思うものについては、EDIT2を参照してください。)
Boostパラメータライブラリの具体的な答えはわかりません。ただし、通常はこれがより良い選択であると言えます。その理由は、複数の方法で関係を実装するオプションがある場合は常に、最も弱いもの(低結合度/高凝集度)を選択する必要があるためです。継承は構成よりも強いので...
プライベート継承を使用すると、例外安全コードの実装も困難になる場合があることに注意してください。operator==
たとえば、を考えてみましょう。コンポジションを使用すると、一時的なものを作成し、コミット/ロールバックロジックを使用して割り当てを行うことができます(オブジェクトが正しく構築されていることを前提としています)。ただし、継承を使用する場合は、派生クラスのBase::operator==(obj)
内部のようなことを行う可能性があります。operator==
そのBase::operator==(obj)
呼び出しがスローされた場合、あなたはあなたの保証を危険にさらします。
編集2: 今、あなたが本当に尋ねたことに答えようとしています。これはあなたが提供したリンクから私が理解できたものです。ライブラリの詳細がわからないので、間違っている場合は訂正してください。
「の観点から実装」にコンポジションを使用する場合、委任に対して1レベルの間接参照が必要です。
struct AImpl
{
//Dummy code, just for the example.
int get_int() const { return 10; }
};
struct A
{
AImpl * impl_;
int get_int() const { return impl->get_int(); }
/* ... */
};
パラメーターが有効なコンストラクターの場合、実装クラスを作成する必要がありますが、それでも「ラッパー」クラスを透過的に使用できるはずです。これは、あなたが言及したリンクの例では、myclass
操作するのと同じように操作できることが望ましいことを意味しますmyclass_impl
。これは、継承を介してのみ実行できます。(この例では、継承が構造体のデフォルトであるため、継承がパブリックであることに注意してください。)
myclass_impl
「実際の」クラス、データ、動作などを含むクラスであると想定します。次に、そのようなメソッドがありget_int()
、継承を使用しなかった場合は、get_int()
ラッパーを作成する必要がありmyclass
ます。私が上でしたように。