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

Private inheritance along class hierarchy, why friend is needed all along the hierarchy

本文关键字:层次结构 朋友 为什么 继承      更新时间:2023-10-16

请考虑以下代码:

#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();
}

根据这个答案,成员变量A::a在所有类中都"存在",但它的可见性不同,即在BC中不可见,除非我们BC A的朋友。我的问题是为什么我需要C成为AB的朋友?我本来认为A的朋友声明就足够了。如果我从AB中删除friend class C;声明,代码将无法编译。

我的问题是为什么我需要让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