为什么友谊在 C + + 中不是可选的继承?我知道由于显而易见的原因,及物性和反身性是被禁止的(我这样说只是为了避免简单的常见问题引用答案) ,但是缺少类似 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. */ };
接受的答案是: 作为 洛基说,这种效果可以通过在好友基类中创建受保护的代理函数来或多或少地模拟,因此没有严格的 需要来向类或虚方法层次结构授予友谊。我不喜欢对样板代理的需要(好友基础实际上变成了这样) ,但我认为这比一种更可能在大多数时候被误用的语言机制更可取。我认为是时候买下并阅读 Stroupstrup 的 C + + 的设计与演化了,我已经看到很多人在这里推荐它,以便更好地洞察这类问题... ..。