web-dev-qa-db-ja.com

C ++フレンド継承?

サブクラスは、メインクラスのフレンドアソシエーション(メインクラス自身のフレンドとメインクラスとフレンドになる他のクラスの両方)を継承しますか?

または別の言い方をすれば、継承は友達のキーワードにどのように適用されますか?

拡大する:そうでない場合、友情を継承する方法はありますか?

私はジョンの提案に従ってデザイン問題を投稿しました:
C++クラスの設計に関する質問

35
SSight3

友情はC++では継承されません。

規格は言う(ISO/IEC 14882:2003、セクション11.4.8):

友情は相続も継承もありません。

43
Jon

friendは、明示的にフレンドにするクラスにのみ適用され、他のクラスには適用されません。

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

9
balki

親で(静的)保護されたメソッドを作成すると、そのようなことを実行できます。

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

ただし、これはカプセル化をバイパスするので、おそらく設計を再検討する必要があります。

8
selalerer

答えは非常に簡単です。いいえ、サブクラスはフレンドの関連付けを継承しません。友達は、関連付けが宣言されているクラスのプライベートメンバーにのみアクセスでき、そのクラスの親や子のメンバーにはアクセスできません。スーパークラスの保護されたメンバーにアクセスしているかもしれませんが、それについてはよくわかりません。

2
Aardvark Soup