Потому что я могу написать Foo
и его друга Bar
(таким образом, существуют доверительные отношения).
Но могу ли я доверять людям, которые пишут классы, производные от Bar
?
На самом деле, нет. Поэтому они не должны наследовать дружбу.
Любое изменение во внутреннем представлении класса потребует модификации чего-либо, что зависит от этого представления. Таким образом, все члены класса, а также все его друзья будут нуждаться в модификации.
Поэтому, если внутреннее представление Foo
изменяется, тогда Bar
также должен быть изменен (потому что дружба тесно связывает Bar
с Foo
). Если бы дружба была унаследована, тогда весь класс, производный от Bar
, также был бы тесно связан с Foo
и, следовательно, требовал бы изменения, если внутреннее представление Foo
изменяется. Но я ничего не знаю о производных типах (и я не должен. Они могут даже разрабатываться различными компаниями и т. Д.). Таким образом, я не смог бы изменить Foo
, поскольку это внесло бы критические изменения в базу кода (поскольку я не мог изменить весь класс, производный от Bar
).
Таким образом, если дружба была унаследована, вы случайно вводите ограничение на возможность изменять класс. Это нежелательно, поскольку вы в принципе лишаете себя смысла в концепции публичного API.
Примечание: дочерний элемент Bar
может получить доступ к Foo
с помощью Bar
, просто сделайте метод в Bar
защищенным. Затем дочерний элемент Bar
может получить доступ к Foo
, вызвав его родительский класс.
Это то, что вы хотите?
class A
{
int x;
friend class B;
};
class B
{
protected:
// Now children of B can access foo
void foo(A& a, int n) { a.x = n; }
};
class D : public B
{
public:
foo(A& a, int n)
{
B::foo(a, n + 5);
}
};