请考虑以下代码: #include iostreamclass A{ friend class C; int a{42};};class B: private A{ friend class C;};class C: private B {public: void print() {std::cout a '\n';}};int main() { C c; c.print();} 根据this answer,成员变量A
#include <iostream> class A{ friend class C; int a{42}; }; class B: private A{ friend class C; }; class C: private B { public: void print() {std::cout << a << '\n';} }; int main() { C c; c.print(); }
根据this answer,成员变量A :: a在所有类中都“存在”,但其可见性不同,即在B或C中不可见,除非我们将B或C作为A的朋友.我的问题是我为什么需要让C成为A和B的朋友?我会尽管A中的朋友声明就足够了.如果我删除朋友类C;来自A或B的声明,代码无法编译.
My question is why do I need to make C a friend of both A and B?
如果没有B声明C有朋友,C就不会看到B继承A.即使C看到A :: a,也不会看到B :: a.
确实:
> C继承B,因此可以从C访问B中的所有公共内容.>但B从A私下继承.C是B的朋友,让C看到这个继承.> A :: a的访问是私有的,所以即使C将A视为其祖先,它也需要成为A的朋友才能看到A :: a.