0

よく言われるように「友達は遺伝しない」。
だということだ

class c
 {public:
 friend void i_am_friend();
 };

class d:public c
{public:
 //
};

ここで void i_am_friend()はクラス d で継承されません。より技術的な用語で (私はこのように考えています。)

クラス d のオブジェクトは、基本クラスのフレンドであるため、 void i_am_friend()に割り当てられるメモリはありません。
次に、質問番号を検討してください。このページの14.3 http://www.parashift.com/c++-faq/friends.html

class Base {
 public:
   friend void f(Base& b);
   ...
 protected:
   virtual void do_f();
   ...
 };

 inline void f(Base& b)
 {
   b.do_f();
 }

 class Derived : public Base {
 public:
   ...
 protected:
   virtual void do_f();  // "Override" the behavior of f(Base& b)
   ...
 };

 void userCode(Base& b)
 {
   f(b);
 }

このコードはどのように正しいのでしょうか?? なぜなら

クラス派生 d;// d はフレンド関数を持たない
クラス ベース *b=&d; //結果として b もメンバー関数を持たない

したがって、ここでは f(b) の呼び出しはエラーになるはずです。

つまり、正しいことは次のとおりです:-
友情は継承
されないか、友情は継承されますが、派生クラスでは使用できません

4

1 に答える 1

2

友情は受け継がれない

これは、あなたの例でも当てはまります。Derivedf(b) の呼び出しは、オブジェクトが型に変換されるため、エラーにはなりませんBase&

この関数は、クラスfのプライベート部分と保護された部分にのみアクセスできますが、Baseクラスのパブリック部分にのみアクセスできますDerived

于 2012-05-18T04:49:01.777 に答える