2011-08-26 21 views
16

Composizione ereditaria privata VS.Composizione ereditaria privata VS: quando usare quale?

Sto avendo un po 'di confusione quando usarli. Dal momento che le guarnizioni ereditarietà privata, in un certo senso, la catena di ereditarietà, dato:

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 non sarà in grado di utilizzare uno qualsiasi dei campi B s'. Quando dovrei usare l'ereditarietà privata e quando dovrei usare la composizione?

grazie!

+0

Si prega di taggare la domanda con il linguaggio di programmazione specifico che stai chiedendo. –

+1

Possibile duplicato di [Quando utilizzare l'ereditarietà privata C++ sulla composizione?] (Https://stackoverflow.com/questions/6297331/when-to-use-c-private-inheritance-over-composition) –

risposta

19

This C++ FAQ entry risponde correttamente alle vostre domande.

Replica qui:

Usa composizione quando si può, l'ereditarietà privata quando si deve.

Normalmente non si vuole avere accesso alle parti interne del troppe altre classi, e l'eredità privato ti dà un po 'di questa potenza in più (e la responsabilità). Ma l'ereditarietà privata non è cattiva; è solo più costoso da mantenere, poiché aumenta la probabilità che qualcuno cambi qualcosa che infrange il codice.

A, uso legittimo a lungo termine per l'ereditarietà privata è quando si vuole costruire un class Fred che utilizza il codice in un class Wilma, e il codice da class Wilma bisogno di invocare funzioni membro dalla tua nuova classe, Fred. In questo caso, Fred chiama non virtuali nelle chiamate Wilma e Wilma (di solito virtuali puri) in sé, che vengono sovrascritte da Fred. Questo sarebbe molto più difficile da fare con la composizione.

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"; 
    } 
}; 
Problemi correlati