爲什麼友誼至少不能在C++中繼承?我明白傳遞性和反思性被禁止,原因很明顯(我只是說這只是爲了阻止簡單的常見問題引用答案),但是沿着virtual friend class Foo;
的路線缺乏一些東西使我困惑。有人知道這個決定背後的歷史背景嗎?友誼真的只是一個有限的黑客,因爲它已經找到了一些晦澀的可敬的用途?爲什麼C++不允許繼承友誼?
編輯澄清:我說的是以下情形,不其中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 states,效果可以模擬在friended基類進行保護的代理功能,所以有更多或更少沒有嚴格的需要授予友誼的類或虛擬方法heirarchy。我不喜歡使用樣板代理(好友基地有效地成爲代理),但是我認爲這比在大多數情況下更可能被誤用的語言機制更可取。我認爲這可能是我購買和閱讀Stroupstrup的The Design and Evolution of C++,我已經看到足夠的人在這裏推薦,以獲得更好的洞察這些類型的問題的時間...
Bingo。這是關於通過改變一個班級內部造成的傷害限制。 – 2010-08-25 02:12:31
@Jeff:http://www.drdobbs.com/184402053 – 2010-08-25 03:05:26