Почему дружба, по крайней мере, необязательно наследуется на С++? Я понимаю, что транзитивность и рефлексивность запрещены по очевидным причинам (я говорю это только, чтобы отбросить простые ответы на часто задаваемые вопросы), но отсутствие чего-то в духе 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. */ };
Принятый ответ: как состояния Loki, эффект можно моделировать более или менее, создавая защищенные функции прокси в дружественных базовых классах, поэтому нет никакой строгой необходимости в предоставлении дружбы классу или виртуальному методу. Мне не нравится потребность в шаблонных прокси-серверах (которые эффективно подкрепляются базой), но я полагаю, что это считалось предпочтительным по сравнению с языковым механизмом, который скорее всего будет злоупотреблять большую часть времени. Я думаю, что, вероятно, время, которое я купил, и прочитал Stroupstrup Дизайн и эволюция С++, которые я видел достаточно людей здесь рекомендую, чтобы лучше понять эти вопросы...