如果我有三个班级,A、B、C。A 和 B 是朋友(双向)。此外,B 和 C 是朋友(双向)。A有一个指向B的指针,B有一个指向C的指针。为什么A不能通过指针访问C的私有数据?
澄清一下:这是一个纯理论 C++ 语言问题,而不是设计建议问题。
约翰是我的一个朋友,他可以随时使用我的无线连接(我相信他)。
约翰的朋友蒂姆虽然是个废物,虽然约翰是我的朋友,但我不把蒂姆列为朋友,因此我不让他使用我的无线连接。
约翰的孩子也是一群流氓,所以我不相信他们,他们绝对不是我的朋友,也不是我自己的孩子,我尽可能地信任他们。
虽然我们的孩子不能直接访问无线网络,但如果他们通过我们,他们可以访问无线网络。因此,如果约翰的孩子通过约翰访问我的无线设备(即他们受到约翰的监督和保护),他们就可以访问我的无线设备。
约翰有一份政府工作,所以不幸的是,他不能信任任何人,尤其是在无线方面。
这允许诸如复制构造函数之类的东西,即使没有真正的访问,您也可以访问另一个对象的私有成员。
所以我也自动成为我所有克隆的朋友 :-) 因为它们只是我自己的其他实例。
C++ 中的友谊不是传递的:
(A is friend of B) and (B is friend of C) does not mean (A is friend of C)
此外,友谊不是对称的。
(A is friend of B) does not mean (B is friend of A)
您必须明确声明 A 是 C 的朋友,才能从 A 中访问 C 的私有内容。如果向类添加 setter 和 getter 会暴露不应该暴露的信息,如果不能,您应该考虑朋友发现你的设计有问题(使用朋友是有效的。这不是糟糕设计的标志)。如果您可以添加 setter 和 getter 而不会破坏接口,那么您应该避免与其他类成为朋友。请注意,嵌套类始终是嵌套类的朋友。所以嵌套类可以看到嵌套类的私有信息。
我在等待回复时发现了这篇文章。它很好地回答了我的问题: Friend scope in C++
因为在 C++ 中友谊不是传递属性。实际上应该尽可能避免它,因为它会在系统中引入复杂性。
想象一下 B 是一个中介类,A 和 C 是需要管理的组件,你真的认为按钮需要访问复选框的实现是否有意义?
顺便说一句,在你问的情况下,我看不出你的标题的“层次结构”在哪里。
这一切都在这里得到了很好的总结:
What does it mean that "friendship isn't inherited, transitive, or reciprocal"?
-->
这意味着从朋友类派生的类不会自动成为朋友(你相信朋友的孩子吗?),朋友的朋友不会自动成为朋友(你相信朋友的朋友吗?) ,并且将另一个类声明为“朋友”的类不会自动成为该类的朋友(您相信任何称您为朋友的人吗?)。
从