Могут ли отношения «друг» быть перенесены в класс C ++? - PullRequest
3 голосов
/ 18 сентября 2011

предположим, что класс A - друг класса B, а B - друг класса C, друг C или C - друг A, или оба, или никто?

Ответы [ 3 ]

5 голосов
/ 18 сентября 2011

Нет, дружба в C ++ не транзитивна.

Из стандарта C ++ 03, 11.4-8:

Дружба не является ни наследственной, ни переходной. Пример:

class A {
  friend class B;
  int a;
};

class B {
  friend class C;
};

class C {
  void f(A* p)
  {
    p->a++; 
    // error: C is not a friend of A
    // despite being a friend of a friend
  }
};

class D : public B {
  void f(A* p)
  {
    p->a++; 
    // error: D is not a friend of A
    // despite being derived from a friend
  }
};
1 голос
/ 18 сентября 2011

Отсутствует.См. C ++ FAQ :

Дружба не является наследственной, переходной или взаимной

0 голосов
/ 18 сентября 2011

Дружба класса C ++ не распространяется таким образом, поэтому класс A не будет другом класса C.Это похоже на Facebook, если кто-то из ваших друзей подружился с кем-то, этот человек не станет вашим другом автоматически =)

...