2013-01-17 20 views
9

Sono un appassionato di programmazione orientata agli oggetti a livello principiante. Ho incontrato il seguente enigma:Classe amicizia - un puzzle

class A { 
}; 

class B { 
protected: 
    friend class A; 
}; 

class C { 
public: 
    friend class B; 
}; 

Riferendosi al codice di esempio sopra esposto, ipotizzando le classi di cui sopra erano membri di dati, quali i nomi dei membri del C potrebbe essere utilizzato nelle dichiarazioni di membri di A?

  1. Solo i membri privati ​​

  2. Solo i membri protetti

  3. tutti i membri di dati di C

  4. Solo i membri pubblici

  5. Nessuno dei membri di dati di C *

La mia scelta è la risposta 4 in quanto l'amicizia non è transitiva. Pertanto, A è un amico di B, ma A non è un amico di C (anche se B è un amico di C). È questo il modo corretto di pensare?

Inoltre, il mio problema è che finora (nel tutorial) che ho incontrato exmaples in cui l'amicizia è stato dichiarato in questo modo:

class X { 
public: 
    friend class Y; 
}; 

Qual è la differenza se al posto dello specificatore pubblico usiamo il protetto uno? Come quella:

class X { 
protected: 
    friend class Y; 
}; 
+0

+1 per una domanda ben formulata. – jrok

risposta

7
  1. Lei ha ragione. L'amicizia non è transitiva né è ereditata.
  2. Non fa alcuna differenza sotto quale specificatore di accesso hai inserito la dichiarazione friend.

Finché la classe A non è dichiarata amica della classe C. Non è possibile accedere a membri protetti o privati ​​di C in A.

+0

Grazie per il chiarimento – Prz3m3k