производный класс не наследует функции друга? […] Почему?
Потому что это нарушит инкапсуляцию: производный класс не сможет больше контролировать своих друзей, поэтому он не сможет контролировать, кто имеет доступ к его внутренним элементам.
они не могут быть объявлены как статические или внешние, почему?
Поскольку static
не имеет смысла (это имеет смысл только в функциях, принадлежащих классу, а friend
s являются свободными функциями), а extern
снова нарушит инкапсуляцию, потому что класс не может эффективно больше не контролируйте, какая функция имеет к ней доступ: из-за того, что он является extern
, друг может фактически прибыть из другого модуля компиляции, неизвестного классу.
См. Ответ Яна для исправления.