C ++で友情が少なくともオプションで継承できないのはなぜですか?私は明白な理由で禁止されている推移性と反射性を理解しています(私はこれは単純なFAQの引用回答を回避するためだけに言っています)が、virtual friend class Foo;
パズルの線に沿った何かの欠如は私を困惑させます。この決定の背後にある歴史的背景を知っている人はいますか?友情は本当に限定されたハックに過ぎなかったのか、それからいくつかのあいまいな立派な用途にその道を見つけましたか?
説明のために編集します。私は次のシナリオについて話しています。Aの子がBのいずれか、またはBとその子の両方にさらされているわけではありません。必要に応じて、フレンド関数のオーバーライドなどへのアクセスを許可することも想像できます。
class A {
int x;
friend class B;
};
class B {
// OK as per friend declaration above.
void foo(A& a, int n) { a.x = n; }
};
class D : public B { /* can't get in A w/o 'friend class D' declaration. */ };
受け入れ答え:としてロキ状態、効果はfriended基底クラスで保護されたプロキシ機能を作ることによって、多かれ少なかれシミュレートすることができるので、厳密なありません必要性クラスまたは仮想メソッド階層構造に友情を付与するためには。ボイラープレートプロキシ(フレンドベースが効果的になる)の必要性は嫌いですが、ほとんどの場合、誤用される可能性が高い言語メカニズムよりも好ましいと考えられていたと思います。StroupstrupのThe Design and Evolution of C ++を購入して読んだときだと思います。これらの種類の質問についてより深い洞察を得るために、ここで十分な人々が推奨しているのを見てきました...