为什么友谊至少不能在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