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. */ };
受け入れられた答え: Loki が述べているように、フレンドシップされた基本クラスで保護されたプロキシ関数を作成することにより、効果は多かれ少なかれシミュレートできるため、クラスまたは仮想メソッド階層にフレンドシップを付与する厳密な必要性はありません。ボイラープレート プロキシ (フレンドシップ ベースが事実上そうなります) の必要性は嫌いですが、これは、ほとんどの場合誤用される可能性が高い言語メカニズムよりも好ましいと見なされたと思います。これらのタイプの質問に対するより良い洞察を得るために、おそらくStroupstrupのThe Design and Evolution of C++を購入して読む時が来たと思います.