2011-08-26 16 views
16

निजी विरासत वीएस संरचना।निजी विरासत वीएस संरचना: कब उपयोग करें?

मुझे प्रत्येक का उपयोग करने के लिए थोड़ा भ्रम हो रहा है। निजी वंशानुक्रम जवानों के बाद से, एक तरह से, विरासत पर श्रृंखला, यह देखते हुए:

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

संभावित डुप्लिकेट [जब रचना पर सी ++ निजी विरासत का उपयोग करना है?] (Https://stackoverflow.com/questions/6297331/when-to-use-c-private-inheritance-over-composition) –

उत्तर

19

This C++ FAQ entry अपने प्रश्नों का उत्तर सही तरीके से दें।

इसे यहाँ प्रतिकृति:

उपयोग रचना जब आप निजी रूप विरासत आप के लिए हो सकता है जब जब।

आम तौर पर आप कई अन्य वर्गों के आंतरिक भाग तक नहीं पहुंचना चाहते हैं, और निजी विरासत आपको कुछ अतिरिक्त शक्ति (और जिम्मेदारी) देता है। लेकिन निजी विरासत बुराई नहीं है; यह बनाए रखने के लिए और अधिक महंगा है, क्योंकि इससे संभावना बढ़ जाती है कि कोई ऐसा कुछ बदल देगा जो आपके कोड को तोड़ देगा।

एक वैध, निजी वंशानुक्रम के लिए लंबी अवधि के उपयोग है जब आप एक class Fred एक class Wilma में कोड का उपयोग करता है का निर्माण करना चाहते हैं, और class Wilma जरूरतों से कोड अपने नए वर्ग, Fred से सदस्य कार्यों को लागू करने की। इस मामले में, FredWilma, और Wilma कॉल (आमतौर पर शुद्ध वर्चुअल) में गैर वर्चुअल कॉल करता है, जो 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"; 
    } 
}; 
संबंधित मुद्दे