2011-07-20 10 views
4

私は(完全な参照ハーバートSchildt)によると、派生クラスは友人機能を継承せず、友人機能は 記憶クラス指定子を持たないかもしれません。つまり、静的または外部として宣言することはできません。どうして?友人機能に関する制限

+0

は離れて本を投げ、新しいものを購入しています。ハーブSchildtのの本は、その技術的な誤りのために[普遍けなさ](http://www.cs.technion.ac.il/users/yechiel/CS/BadBooksC+C++.html#SchildtAny)です。 –

答えて

8

派生クラスは、フレンド機能を継承しないのですか? […] なぜ?

それはカプセル化を破るので:派生クラスは、もは​​やそれが効果的にその内部へのアクセス権を持つユーザーを制御することはできませんその友人を制御することができませんでした。

静的または外部として宣言されていない可能性があります。なぜですか?

クラスが効果的にもはやその機能を制御することはできませんのでstaticは、(それが唯一のクラスに属する機能で理にかなっている、とfriend sが自由な機能です)意味をなさないだろう、とexternは再びカプセル化に違反しているためexternであるため、友達は事実上、クラスには分からない別のコンパイル単位から来る可能性があります。

は、補正のための月の回答を参照してください。そうすることでポイントがあるので

+2

申し訳ありませんが、この回答の2番目の部分は完全に間違っています。 'static'は自由な関数に意味があり(コンパイル単位に対してローカルになります)、キーワード' static'を含まないすべての自由関数宣言は暗黙的に 'extern'を含みます。また、クラスはコンパイル単位に関連付けられていません。友人は効果的に*どんな*編集単位からでも来ることができます、それは "異なっている"かどうかは定義できません。 –

+0

@Janあなたは正しいです。 –

5
  1. 継承クラスは、揚げの機能を継承しません:
    1. フレンド関数自体がその友人それはクラスについて知っているが、それは魔法の新しいサブクラスを学びませんそれで、それはどちらかの友人である必要はありません。
    2. 親への暗黙的な変換のために派生クラスに機能を使用することも可能です。それは、関数のシグネチャの一部ではないので、関数を指定する必要はないので
  2. friend宣言は、staticexternを含めることはできません。私は、関数自体の宣言は(クラスの外では)どちらか含めることができると信じています。
関連する問題