2012-03-07 7 views
0

これが私の疑問です: 私は書くことができ、二つのクラスAとB を持っている:公開オブジェクトを継承または使用するのに最適なのは何ですか?

class A: public B {....} 

のでan_instance_of_Aは、B法を使用することができます。

しかし、私はまた書くことができます:

class A { 
public: 
B instance_B; 
} 

のでan_instance_of_Aはinstance_Bのメソッドを使用することができます。 (すなわち、B法)。

私は同じことができます。 ベストは何ですか?コンパイルするのが速いのは何ですか?それは同じですか?おかげさまで

+0

これは依存しています。 'A'と' B'とは何ですか? 'A'は' B'ですか?なぜ公開する必要がありますか?コンパイルの速度は正しい設計ほど重要ではありません(最も極端な状況を除いて)、良い設計ではコンパイル時間が長くなることはまれです。 –

+1

問題は方法を使用するのではなく、問題に最適なデザインを選択することです。これを取り巻く話題には数多くの本が書かれています。あなたはウィキペディアから始めることができます:http://en.wikipedia.org/wiki/Composition_over_inheritance、http://en.wikipedia.org/wiki/Circle-ellipse_problemそしてそこから続行してください。 – dbrank0

+0

[継承を超える構成を推奨しますか?](http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance) –

答えて

0

公開継承は、is-aの関係を表します。つまり、BでできることはAでもできるのです。

パブリックオブジェクトはまったく異なるものであり、共通点ではありません。 AにBが複数ある場合、継承は使用できませんので、の構成(メンバーオブジェクト)を使用してください。彼らが公開されているかどうかは、AとBとそれらをどのように使いたいかによって決まります。

EDITは、この質問が近いマッチ重複しているようだ:

Prefer composition over inheritance?

ジェームズが言ったように、特別な場合を除いて相続又は組成物との間で選択する際に高い優先順位をすべきではない時間をコンパイルします。

2

は、「is-a」関係がある場合にを継承します。 vehiclecarの間のように。

データメンバーは、 "contains"または "consisting of"タイプのrealtionがある場合に使用します。 class schoolは、class teacher,class studentなど

0

となります。前述のように、公開継承は、AがBでもある場合のみ使用してください(ワーカーもPersonです)。

クラス内のオブジェクトインスタンスを持つことは、パブリックでない限り、テストとカプセル化に適しています。 PODを除き、メンバーを公開しないでください。これによりいくつかの問題が発生します(例:誰かがあなたのクラスの完全性を簡単に破ることができます)