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

vso*_*tco 3 c++ friend

请考虑以下代码:

#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();
}
Run Code Online (Sandbox Code Playgroud)

根据这个答案,成员变量A::a在所有班"礼物",但其知名度有所不同,即是不可见的BC除非我们B还是C朋友A.我的问题是,为什么我需要C的朋友 AB?我会尽管朋友声明A就足够了.如果我删除了friend class C;从该声明A或者B,代码编译失败.

YSC*_*YSC 6

我的问题是,为什么我需要使C的朋友 A和B?

如果没有B声明C有一个朋友,C就不会看到 B的继承A.虽然C看到 A::a,但它看不到 B::a.

确实:

  • C继承B,所以任何公众B为访问C.
  • B继承了私下A.C作为朋友B品牌C 看到这种继承.
  • 的访问A::a是私人的,所以即使C 看到 A它的祖先,它需要的朋友A看看 A::a.