为什么友谊至少不能在 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. */ };
接受的答案:正如Loki 所说,可以通过在友元基类中创建受保护的代理函数或多或少地模拟效果,因此没有严格需要为类或虚拟方法层次结构授予友谊。我不喜欢样板代理的需要(友好的基础实际上变成了),但我认为这被认为比大多数时间更可能被滥用的语言机制更可取。我想我可能是时候购买并阅读 Stroupstrup 的The Design and Evolution of C++ 了,我在这里看到了足够多的人推荐它,以便更好地了解这些类型的问题......