Почему C ++ не позволяет наследственную дружбу?

Почему дружба по крайней мере необязательно наследуется в C ++? Я понимаю, что транзитивность и рефлексивность запрещены по понятным причинам (я говорю это только для того, чтобы избежать простых ответов на часто задаваемые вопросы), но нехватка чего-то вродеvirtual friend class Foo; озадачивает меня Кто-нибудь знает историческую подоплеку этого решения? Действительно ли дружба была лишь ограниченным взломом, который с тех пор нашел свое место в нескольких неясных респектабельных целях?

Изменить для уточнения: Я говорю о следующем сценарии,не где дети A подвергаются воздействию либо B, либо B и его детей. Я также могу представить, что при желании можно получить доступ к переопределениям функций друзей и т. Д.

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

class B {
  // OK as per friend declaration above.
  void foo(A& a, int n) { a.x = n; }
};

class D : public B { /* can't get in A w/o 'friend class D' declaration. */ };

Принятый ответ: какЛоки заявляетэффект может быть более или менее смоделирован путем создания защищенных прокси-функций в базовых классах с друзьяминеобходимость за предоставление дружбы классу или виртуальному методу иерархии. Мне не нравится потребность в стандартных прокси-серверах (которые фактически становятся дружественной базой), но я полагаю, что это было сочтено предпочтительным по сравнению с языковым механизмом, который с большей вероятностью использовался бы в большинстве случаев неправильно. Я думаю, что пришло время покупать и читать StroupstrupДизайн и эволюция C ++, что я видел достаточно людей, которые рекомендуют здесь, чтобы лучше понять эти типы вопросов ...

Ответы на вопрос(10)

Ваш ответ на вопрос