为什么友谊在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 ++》(我已经在这里看到足够多的人推荐)的时候,才能更好地了解这些类型的问题……