Чому дружба не є принаймні необов’язково успадковуваною в 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's The Design and Evolution of C ++ , який я бачив тут досить багато людей, щоб краще зрозуміти ці типи питань ...