2011-09-17 8 views
4

私は友情が継承されていないことを知っています。私は自分自身に尋ねていた:なぜ?なぜC++のデザイナーは、友情を継承させないことを決めたのですか?あなたは友情の継承が有益なものになることが分かりますか?私自身の答えは「はい」です:BがAの友人であるのと同じように、私はクラスの全家族をA(Bとその派生物)の友人にしたいと思います。 のみ BはAの友人であるか、またはB その派生クラスはA.C++友情と継承

Psとの友人も聞かせてみましょう:たぶん、人は言うことができるはずです。 なぜあなたの多くが、私がの自動友情の延長を求めていると思ったのか分かりません。私は、プログラマがある種のメカニズム(自動的にではない)を使って家族全体に友情を広げる可能性についてもっと興味を持っていました。

+1

魅力的な使用例は表示されていません。個人的には、私は有用性を見ません。ほとんどの場合、通常の継承を使うことができるので、友人関係を継承する必要はありません。関数 'foo(A&)'は 'A'の友人であり、もちろん' B'型の引数でも動作します。 –

+0

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

+0

'Friend'shipの全目的は、強力なカップリングを持っている2つのエンティティが、友情を継承し伝播できることを示すことです階層に沿ってそれは友人の存在のためのこの非常に基礎を破り、また非常にOOPの原則を破るだろう。 –

答えて

4

friend宣言はフレンドリーで信頼するとの強力な関係を作成します。

  • それはその内部
  • へのフルアクセスを持っているので、それがあることを意味の信頼の表現に配慮を下に結びつけます

したがって、継承が達成できない正確なスコープを明確に特定することをお勧めします。漏れがあります。

実際には、相続はでも必要ではありません。です。友情が何を達成しようとしているかによって、実際には2つの選択肢があります。彼らは私が今まで出会ったシナリオをカバーしています。あなたの例では、プロキシ

として

フレンドリーFriendlyの誘導体は、単にので、あなたが場所の限定セットにTrusting上で発生する操作を制御させる、Friendlyを通じてTrustingに到達することができます。

class Trusting { friend class Friendly; }; 

class Friendly { protected: void modifyTrusting(); }; 

modifyTrustingの実装では、動作をカスタマイズするために、仮想呼び出し(フック)を意味するものではありかもしれませんが、関係なく、これらのフックはクラス不変条件が破壊されないことを保証するためにFriendly次第です。この場合、

を信頼

それほどTrustingはロックされたメソッドを介して、そのインタフェースの一部だけを開き、そしてFriendlyへの鍵を付与します。 Friendlyは、代わりに信頼するクラスにキーを与えるかもしれませんが、実際には関係ありません。いずれにしても、Trustingは、その不変量が壊れていないことを保証し、キーはメソッドの公開を減らすための仕組みに過ぎません。

class Key { friend class Friendly; Key() {} ~Key() {} }; 

class Trusting { public: void doSomething(Key const&); }; 

class Friendly { protected: Key const& key() const; }; 
私は、この後者の方法に本当に部分だし、それがTrustingの実装の詳細にFriendlyの露出を制限するため、定期的にそれを使用することを認めなければならない

。それはまた明確にどの部分のTrusting私たちの親愛なるFriendlyのアクセスを文書化する。

1

これはひどい考えです。

友情は友人同士の緊密なつながりを引き起こすため、継承されません。派生したクラスもすべて自動的に仲間であった場合、元のオブジェクトと継承されたすべてのクラス間の緊密なバインディングが発生します。

タイトカップリングは、一緒に作成されて維持されるクラスでは問題ありません。しかし、他のユーザーによって作成されたクラスの場合、密結合はメンテナンスの悪夢を引き起こし、元のオブジェクトを変更することができなくなります。

2

私は昨日面白いバンパーステッカーを見ました: "私の義母は旅行代理店です... 罪悪感旅行のため"。友情は人間関係においてある程度受け継がれています。これはSOの友人や家族についての面白いジョークにつながりますが、悲惨さや苦しみは多くのジョークの基礎であることを覚えておくことが重要です。

開発者は、これが引き起こす悲惨さと苦しみの量を予見していたので、友情はC++で継承されません。