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