C ++ друг наследование? - PullRequest
       4

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

30 голосов
/ 10 сентября 2011

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

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

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

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

Ответы [ 4 ]

37 голосов
/ 10 сентября 2011

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

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

Дружба не является ни наследственной, ни переходной.

8 голосов
/ 10 сентября 2011

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

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

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

7 голосов
/ 10 сентября 2011

друг относится только к классу, который вы явно сделаете его другом, а не к другому классу.

http://www.parashift.com/c++-faq-lite/friends.html#faq-14.4

2 голосов
/ 10 сентября 2011

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

...