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
のアクセスを文書化する。
魅力的な使用例は表示されていません。個人的には、私は有用性を見ません。ほとんどの場合、通常の継承を使うことができるので、友人関係を継承する必要はありません。関数 'foo(A&)'は 'A'の友人であり、もちろん' B'型の引数でも動作します。 –
http://www.parashift.com/c++-faq-lite/friends.html#faq-14.4 – Mat
'Friend'shipの全目的は、強力なカップリングを持っている2つのエンティティが、友情を継承し伝播できることを示すことです階層に沿ってそれは友人の存在のためのこの非常に基礎を破り、また非常にOOPの原則を破るだろう。 –