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

时间:2019-02-12 18:46:09

标签: 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();
}

根据this answer,成员变量A::a在所有类中都“存在”,但是其可见性不同,即除非在BC中不可见使BC成为A的朋友。我的问题是为什么我需要让C成为 AB的朋友?我希望A中的朋友声明就足够了。如果我从friend class C;A中删除了B声明,则代码将无法编译。

1 个答案:

答案 0 :(得分:6)

  

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

如果没有B声明C有一个朋友,C不会看到 B继承A。即使C看到 A::a,却不会 B::a

确实:

  • C继承了B,因此BC中任何 public 都可以访问。
  • 但是BA私有继承CB的朋友,因此C 请参见该继承。
  • A::a的访问是私有的,因此即使C A视为其祖先,也需要成为{{1}的朋友}来参见 A