Ответ 1
Дружба не наследуется в С++.
В стандарте говорится (ISO/IEC 14882: 2003, раздел 11.4.8):
Дружба не наследуется и не транзитивна.
Наследует ли подкласс основные ассоциации друзей (как основной класс, так и другие классы, связанные с основным классом)?
Или, по-другому, как наследование применяется к ключевому слову friend?
Чтобы расширить: А если нет, есть ли способ наследовать дружбу?
Я последовал за предложением Jon, чтобы опубликовать проблему с дизайном:
Вопросы дизайна класса С++
Дружба не наследуется в С++.
В стандарте говорится (ISO/IEC 14882: 2003, раздел 11.4.8):
Дружба не наследуется и не транзитивна.
friend применяется только к классу, который вы явно делаете его другом и другим классом.
Вы можете создавать (статические) защищенные методы в родительском, что позволит вам делать такие вещи.
class MyFreind
{
private:
int m_member;
friend class Father;
};
class Father
{
protected:
static int& getMyFreindMember(MyFreind& io_freind) { return io_freind.m_member; }
};
class Son : public Father
{
public:
void doSomething(MyFriend& io_freind)
{
int& friendMember = getMyFreindMember(io_freind);
// ....
} // ()
};
Это, однако, обходит инкапсуляцию, поэтому вам, вероятно, следует взглянуть на ваш дизайн еще раз.
Ответ очень прост: нет, подклассы не наследуют ассоциации друзей. Друг может получить доступ только к частным членам класса, в которых объявлена ассоциация, а не к родителям и/или детям этого класса. Хотя вы можете быть защищенным членом суперкласса, но я не уверен в этом.