2013-01-17 10 views
9

私は初心者レベルのオブジェクト指向プログラミング愛好家です。私は、次のパズルに遭遇している:クラスの友情 - パズル

class A { 
}; 

class B { 
protected: 
    friend class A; 
}; 

class C { 
public: 
    friend class B; 
}; 

は、上記のクラスはデータメンバを持っていたと仮定すると、上記のサンプルコードを参照し、Cのメンバーの何名がAのメンバーの宣言で使用されるだろうか?

  1. だけのプライベートメンバー

  2. だけ保護メンバー

  3. Cのデータメンバのすべて

  4. パブリックメンバーしかCのデータメンバの

  5. なし*

私の選択は、友情は推移的ではないので、答え4です。したがって、AはBの友人ですが、AはCの友人ではありません(BはCの友人です)。 正しい考えですか?

また、私の問題は、これまで(チュートリアルで)私は友情が、このように宣言されたexmaples会ったということです。

class X { 
public: 
    friend class Y; 
}; 

代わりに公共指定子の私たちが使用した場合の違いは何です保護されたもの?そのような:

class X { 
protected: 
    friend class Y; 
}; 
+0

+1よく質問された質問です。 – jrok

答えて

7
  1. あなたは正しいです。友情は推移的でも継承されない。
  2. friend宣言を入れたアクセス指定の下では違いはありません。

クラスA自体がクラスCのフレンドと宣言されていない限り。 Cの保護されたメンバーまたはプライベートメンバーには、Aにアクセスすることはできません。

+0

ありがとうございます – Prz3m3k