2011-09-10 15 views
27

Una sottoclasse eredita, le principali associazioni di amici della classe principale (sia la classe principale che le altre classi che hanno familiarità con la classe principale)?C++ friend inheritance?

O per dirla diversamente, come si applica l'ereditarietà alla parola chiave friend?

Per espandere: E se no, esiste un modo per ereditare l'amicizia?

Ho seguito il suggerimento di Jon per pubblicare il problema di progettazione:
C++ class design questions

+3

Se il tuo progetto richiede amicizia ereditata, è una buona indicazione che il tuo progetto ha bisogno di un cambiamento. –

+0

Qual è il caso d'uso per questa funzione? A seconda di ciò che vuoi veramente fare, potrebbero esserci altre alternative rispetto a rendere tutte le tue classi così amichevoli –

+0

@David: includerò un collegamento a una domanda che descrive la situazione. – SSight3

risposta

35

amicizia non è ereditato in C++.

La norma dice (ISO/IEC 14882: 2003, sezione 11.4.8):

amicizia non è né ereditato né transitiva.

+0

Esiste comunque un modo per farlo ereditare? – SSight3

+2

@ SSight3: No, è necessario rendere esplicitamente tutte le classi negli amici della gerarchia (possibilmente con l'aiuto di un preprocessore del codice sorgente). Se hai un problema specifico da risolvere, chiedi esplicitamente. – Jon

+0

Sembra un buon suggerimento. – SSight3

2

La risposta è molto semplice: no, sottoclassi non ereditano associazioni amico. Un amico può accedere solo ai membri privati ​​della classe in cui è dichiarata l'associazione, non a quelli di genitori e/o figli di quella classe. Sebbene tu possa essere un membro protetto di una superclasse, ma non ne sono sicuro.

+2

Una classe derivata può sempre accedere ai membri protetti della classe Base, è tramite ** Ereditarietà ** non ** Friend ** spedizione. –

+0

@Als: 'Una classe derivata può sempre accedere ai membri protetti della classe Base'. No, in realtà dipende. Dipende dal tipo di eredità! – Nawaz

+0

@Nawaz: Non proprio! [quali sono gli specificatori di accesso dovrei ereditare con private protected o public] (http://stackoverflow.com/questions/5447498/what-are-access-specifiers-should-i-hertered-with-private-protected-or-public /% 5d) dovrebbe essere una buona lettura per te. –

6

È possibile creare metodi (statici) protetti nel genitore che consentiranno di fare cose del genere.

class MyFreind 
{ 
private: 
    int m_member; 
    friend class Father; 
}; 

class Father 
{ 
protected: 
    static int& getMyFreindMember(MyFreind& io_freind) { return io_freind.m_member; } 
}; 

class Son : public Father 
{ 
public: 
    void doSomething(MyFriend& io_freind) 
    { 
     int& friendMember = getMyFreindMember(io_freind); 
     // .... 
    } //() 
}; 

Questo tuttavia ignora l'incapsulamento, quindi probabilmente dovresti dare una seconda occhiata al tuo progetto.

+0

Questo sembra più applicabile anche all'altra domanda collegata. Esito positivo. Sto pensando che una riprogettazione sia in corso. – SSight3