Подтвердить что ты не робот

Наследование друга С++?

Наследует ли подкласс основные ассоциации друзей (как основной класс, так и другие классы, связанные с основным классом)?

Или, по-другому, как наследование применяется к ключевому слову friend?

Чтобы расширить: А если нет, есть ли способ наследовать дружбу?

Я последовал за предложением Jon, чтобы опубликовать проблему с дизайном:
Вопросы дизайна класса С++

4b9b3361

Ответ 1

Дружба не наследуется в С++.

В стандарте говорится (ISO/IEC 14882: 2003, раздел 11.4.8):

Дружба не наследуется и не транзитивна.

Ответ 3

Вы можете создавать (статические) защищенные методы в родительском, что позволит вам делать такие вещи.

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);
        // ....
    } // ()
};

Это, однако, обходит инкапсуляцию, поэтому вам, вероятно, следует взглянуть на ваш дизайн еще раз.

Ответ 4

Ответ очень прост: нет, подклассы не наследуют ассоциации друзей. Друг может получить доступ только к частным членам класса, в которых объявлена ​​ассоциация, а не к родителям и/или детям этого класса. Хотя вы можете быть защищенным членом суперкласса, но я не уверен в этом.