沿类层次结构的私人继承,为什么在整个层次结构中都需要朋友
Private inheritance along class hierarchy, why friend is needed all along the hierarchy
请考虑以下代码:
#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
在所有类中都"存在",但它的可见性不同,即在B
或C
中不可见,除非我们B
或C
A
的朋友。我的问题是为什么我需要C
成为A
和B
的朋友?我本来认为A
的朋友声明就足够了。如果我从A
或B
中删除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
。
相关文章:
- 如何重构类层次结构以避免菱形问题
- C++ 中模板化类型的类层次结构
- 为什么不同类型层次结构的指针之间的dynamic_cast定义得很好?
- 继承层次结构并将元素添加到向量
- C++ 类层次结构中的"对齐"是什么意思?
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 类层次结构中的运算符重载
- 如何在层次结构中实现运算符使用?
- 反向层次结构中的可变参数模板参数
- 如何在继承层次结构中调用具有默认参数的构造函数?
- C++ 提升 - 包含类层次结构对象的类的序列化
- 在C++继承层次结构时提取实现者
- 在C++中将类实例添加到对象层次结构中的问题
- 确定大层次结构中基本指针的实际类型,无需dynamic_cast
- 在继承层次结构中复制和移动
- 模板冲突的类型-但类型应该是相同的cfr类层次结构
- 删除父/子窗口层次结构的最佳方法
- 是否可以使一个类成为两个不同层次结构的子类?
- 我们可以在层次结构中创建多个纯虚拟接口及其实现而不会代码爆炸吗?
- 沿类层次结构的私人继承,为什么在整个层次结构中都需要朋友