2011-08-26 17 views
16

プライベート継承VSの構成。プライベート継承VSコンポジション:いつ使うのですか?

それぞれを使用するときに少し混乱しています。 private継承シールので、方法で、継承の連鎖は、与えられた:

class A 
{ 
private: 
    int z; 
protected: 
    int y; 
public: 
    int x; 
}; 

class B : private A 
{ 
    /* B's data members and methods */ 
    /* B has access only to A's public and protected */ 
}; 

class C : public B 
{ 
    /* can access no fields of B */ 
}; 

CBのフィールドのいずれかを使用することはできません。私はいつ私的な継承を使用しますか?そして、いつ私は作曲を使用しますか?

ありがとうございました!

+0

質問している特定のプログラミング言語で質問にタグを付けてください。 –

+1

[C++のプライベート継承をコンポジションより使用する場合](https://stackoverflow.com/questions/6297331/when-to-use-c-private-inheritance-over-composition)の可能な複製 –

答えて

19

This C++ FAQ entryは適切に質問に答えます。

ここでそれを複製:

使用組成ときにすることができ、プライベート継承あなたがする必要があります。

通常、あまりにも多くの他のクラスの内部にアクセスする必要はなく、プライベート継承によって、この余分な力(および責任)が与えられます。しかし、私的財産は悪くない。誰かがあなたのコードを壊すようなものを変更する可能性を高めるので、維持するのはちょっとだけ高価です。あなたはclass Wilma内のコードを使用し、class Wilmaからコードが新しいクラス、Fredからメンバ関数を呼び出す必要があるclass Fredを構築したいとき

private継承のための合法的、長期的な使用があります。この場合、Fredはの非仮想を呼び出し、の呼び出し(通常は純粋な仮想)をFredで上書きします。これは作曲とはるかに難しいでしょう。

class Wilma { 
protected: 
    void fredCallsWilma() 
    { 
     std::cout << "Wilma::fredCallsWilma()\n"; 
     wilmaCallsFred(); 
    } 
    virtual void wilmaCallsFred() = 0; // A pure virtual function 
}; 

class Fred : private Wilma { 
public: 
    void barney() 
    { 
     std::cout << "Fred::barney()\n"; 
     Wilma::fredCallsWilma(); 
    } 
protected: 
    virtual void wilmaCallsFred() 
    { 
     std::cout << "Fred::wilmaCallsFred()\n"; 
    } 
}; 
関連する問題