2013-01-17 7 views
9

Jestem zorientowanym obiektowo entuzjastą programowania na poziomie początkującym. Mam napotkał następujący puzzle:Przyjaźń klasy - zagadka

class A { 
}; 

class B { 
protected: 
    friend class A; 
}; 

class C { 
public: 
    friend class B; 
}; 

Odnosząc się do przykładowego kodu powyżej, przy założeniu, że powyższe klasy członków danych, co Nazwiska członków c mogłyby być wykorzystane w deklaracji członków?

  1. Tylko prywatne członkowie

  2. Tylko chronione członków

  3. Wszystkie członków danych C za

  4. Tylko członkowie publiczne

  5. Żaden z członków danych C w *

Mój wybór to odpowiedź 4, ponieważ przyjaźń nie jest przechodnia. Dlatego A jest przyjacielem B, ale A nie jest przyjacielem C (mimo że B jest przyjacielem C). Czy to prawidłowe myślenie?

Ponadto, mój problem jest to, że do tej pory (w tutorialu) Poznałem exmaples w którym przyjaźń została zadeklarowane tak:

class X { 
public: 
    friend class Y; 
}; 

Jaka jest różnica, jeśli zamiast specifier publicznego używamy chroniony? Tak:

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

+1 za dobrze sformułowane pytanie. – jrok

Odpowiedz

7
  1. Jesteś poprawne. Przyjaźń nie jest przechodnia ani nie jest dziedziczona.
  2. Nie ma żadnej różnicy w tym, który specyfikator dostępu umieścisz w deklaracji friend.

Dopóki sama klasa A nie zostanie uznana za przyjaciela klasy C. Nie można uzyskać dostępu do chronionych lub prywatnych członków C w A.

+0

Dziękuję za wyjaśnienie – Prz3m3k

Powiązane problemy