### 子类的四种访问权限
在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”这一概念,但通过不同的继承方式可以达到类似的效果。这种机制可以帮助开发者更精细地控制类成员的访问性,从而更好地实现封装和数据隐藏的目的。