### 子类的四种访问权限 在C++中,类的成员访问权限通常分为三种:`public`(公有)、`protected`(受保护)和`private`(私有)。然而,当涉及到类的继承时,实际上存在第四种访问权限的概念——即所谓的“superprivate”(超私有),虽然它并不是C++标准定义的一种访问修饰符,但在继承关系中通过不同的继承方式可以模拟出类似的效果。 #### C++中的基本访问权限 - **Public**: 公有成员可以在任何地方被访问,包括类外部。 - **Protected**: 受保护成员只能被该类及其派生类访问。 - **Private**: 私有成员只能被该类自身访问。 #### 继承与访问权限的变化 当一个类从另一个类派生时,原始类(基类)成员的访问性会根据继承类型(`public`、`protected` 或 `private`)发生变化: 1. **Public Inheritance (公有继承)**: - 基类中的 `public` 成员在派生类中仍然保持 `public`。 - 基类中的 `protected` 成员在派生类中变为 `protected`。 - 基类中的 `private` 成员无法直接在派生类中访问。 2. **Protected Inheritance (受保护继承)**: - 基类中的 `public` 成员在派生类中变为 `protected`。 - 基类中的 `protected` 成员在派生类中保持 `protected`。 - 基类中的 `private` 成员无法直接在派生类中访问。 3. **Private Inheritance (私有继承)**: - 基类中的 `public` 成员在派生类中变为 `private`。 - 基类中的 `protected` 成员在派生类中变为 `private`。 - 基类中的 `private` 成员无法直接在派生类中访问。 #### 第四种访问权限:“Superprivate” 尽管C++标准没有定义“superprivate”,但可以通过私有继承结合私有成员来实现类似效果。这种情况下,基类的私有成员即使是在派生类内部也无法直接访问,这可以被视为一种“超私有”状态。例如,在以下代码片段中,`Human` 类中的 `m_dWeight` 成员在 `Man` 类中是不可见的,即便 `Man` 是 `Human` 的派生类: ```cpp class Human { public: int m_nAge; protected: double m_dHeight; private: double m_dWeight; }; class Man : private Human { // 私有继承 private: bool m_bHandsome; public: void Print() { cout << m_nAge << endl; // 正确 cout << m_dHeight << endl; // 正确 cout << m_bHandsome << endl; // 正确 // cout << m_dWeight << endl; // 错误,不可见 } }; ``` 在这个例子中,尽管 `m_dWeight` 在 `Human` 类中是私有的,但由于 `Man` 通过私有继承从 `Human` 派生,所以 `m_dWeight` 在 `Man` 中是不可见的,这可以看作是一种“superprivate”的行为。 #### 总结 虽然C++标准并没有定义“superprivate”这一概念,但通过不同的继承方式可以达到类似的效果。这种机制可以帮助开发者更精细地控制类成员的访问性,从而更好地实现封装和数据隐藏的目的。
- 粉丝: 49
- 资源: 12
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- asm-西电微机原理实验
- Arduino-arduino
- C语言-leetcode题解之70-climbing-stairs.c
- C语言-leetcode题解之68-text-justification.c
- C语言-leetcode题解之66-plus-one.c
- C语言-leetcode题解之64-minimum-path-sum.c
- C语言-leetcode题解之63-unique-paths-ii.c
- C语言-leetcode题解之62-unique-paths.c
- C语言-leetcode题解之61-rotate-list.c
- C语言-leetcode题解之59-spiral-matrix-ii.c