Почему дружба по крайней мере необязательно наследуется в 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 ++» , которую, как я видел, рекомендует здесь достаточно людей, чтобы лучше понять эти типы вопросов ...