当前位置 : 主页 > 编程语言 > c++ >

c – 沿着层次结构的私有继承,为什么整个层次结构都需要朋友

来源:互联网 收集:自由互联 发布时间:2021-06-23
请考虑以下代码: #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.

网友评论