考虑以下代码:
#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
中的朋友声明就足够了。如果我从friend class C;
或A
中删除了B
声明,则代码将无法编译。
答案 0 :(得分:6)
我的问题是为什么我需要让C成为 A和B的朋友?
如果没有B
声明C
有一个朋友,C
不会看到 B
继承A
。即使C
会看到 A::a
,却不会见 B::a
。
确实:
C
继承了B
,因此B
中C
中任何 public 都可以访问。B
是A
的私有继承。 C
是B
的朋友,因此C
请参见该继承。A::a
的访问是私有的,因此即使C
将 A
视为其祖先,也需要成为{{1}的朋友}来参见 A
。