2011-08-26 20 views
16

Özel kalıtım VS kompozisyonu.Özel kalıtım VS kompozisyon: ne zaman kullanılmalı?

Her birini kullanırken biraz karışıklık yaşıyorum. Özel miras mühürler yana, bir bakıma, miras üzerindeki zincir, verilen:

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 'ın alanların herhangi kullanmak mümkün olmayacaktır. Ne zaman özel miras kullanayım ve kompozisyonu ne zaman kullanırdım?

Teşekkürler!

+0

Lütfen soruyu sorduğunuz özel programlama diliyle etiketleyin. –

+1

Olası kopyası [Kompozisyonun C++ özel mirasını ne zaman kullanmalısınız?] (Https://stackoverflow.com/questions/6297331/when-to-use-c-private-inheritance-over-composition) –

cevap

19

This C++ FAQ entry sorularınızı yanıtlar aptly.

buradan çoğaltılıyor:

kullanın kompozisyon sen özel miras sahip olabilecekken zaman.

Normalde çok fazla diğer sınıfların iç yapıları erişmesini istemiyorsanız, ve özel miras bu ekstra güç (ve sorumluluk) bazı verir. Ancak özel miras, kötülük değildir; Bu, yalnızca birisinin kodunuzu bozacak bir şeyi değiştirmesi olasılığını artırdığı için sürdürmek daha pahalıdır. Bir class Wilma kodu kullanan bir class Fred inşa etmek istediğinizde

özel miras için meşru, uzun süreli kullanım ve class Wilma ihtiyaçları kod -Dersten, Fred gelen üye işlevlerini çağırmak için. Bu durumda, Fred, Wilma'da sanal olmayanları ve Wilma çağrılarını (genellikle saf sanalları), kendi başına Fred tarafından geçersiz kılınır. Bu kompozisyon ile yapmak çok daha zor olurdu.

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"; 
    } 
}; 
İlgili konular