2011-08-26 41 views
16

私人繼承VS組合。私人繼承VS組成:什麼時候用哪個?

我在使用每個時都有點困惑。由於私有繼承密封,在某種程度上,鏈條上的繼承,給出:

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 */ 
}; 

C將無法​​使用任何B的領域。我何時會使用私有繼承,以及何時使用組合?

謝謝!

+0

請用您提及的特定編程語言標記問題。 –

+1

[何時使用C++私有繼承而不是組合?](https://stackoverflow.com/questions/6297331/when-to-use-c-private-inheritance-over-composition) –

回答

19

This C++ FAQ entry恰當地回答你的問題。

複製在這裏:

使用組合物時,你可以,私有繼承時,你必須。

通常情況下,你不想訪問太多其他類的內部,私有繼承給你一些額外的權力(和責任)。但私人繼承不是邪惡的;維護起來更加昂貴,因爲它增加了某人改變某些會破壞你的代碼的可能性。

一個合法的,長期使用的私有繼承是當你想建立一個class Wilma使用代碼class Fred,並從class Wilma的代碼需要從你的新類,Fred調用成員函數。在這種情況下,Fred本身呼叫WilmaWilma呼叫中的非虛擬呼叫(通常是純虛擬呼叫),它將被呼叫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"; 
    } 
}; 
相關問題