类的继承的权限有三种:私有,保护和公有
从访问对象的角度来说一共包含三类访问对象:
- 类的实例
- 友元函数和友元类
- 类的成员函数
针对这三种访问对象我们较为清晰分出继承的访问权限变更。
创建一个父类对象 Father,它有三种权限的成员和一个默认构造函数:
class Father { private : int a; protected: int b; public: int c; Father() { a = 1; b = 2; c = 3; } };
权限 | 私有 | 保护 | 公有 |
成员 | a | b | c |
类的实例 | ❌ | ❌ | ✔ |
友元 | ✔ | ✔ | ✔ |
类的成员函数 | ✔ | ✔ | ✔ |
可见三种不同访问权限的成员,友元函数和友元类的访问权限等级与类成员函数访问权限等级相同。而类的实例只能访问公有权限的成员。
特别注意:友元关系不具有传递性和继承性。
- 私有继承后,子类对所有父类成员的访问变为私有权限。
权限 | 私有 | 保护 | 公有 |
成员 | a | b | c |
子类的实例 | ❌ | ❌ | ❌ |
子类的成员函数 | ❌ | ✔ | ✔ |
- 保护继承后,父类公有成员的访问权限变为保护,其他两种不变。
权限 | 私有 | 保护 | 公有 |
成员 | a | b | c |
子类的实例 | ❌ | ❌ | ❌ |
子类的成员函数 | ❌ | ✔ | ✔ |
- 公有继承后,基类的各种权限不变,但是子类的成员函数无法访问父类的私有成员。
权限 | 私有 | 保护 | 公有 |
成员 | a | b | c |
子类的实例 | ❌ | ❌ | ✔ |
子类的成员函数 | ❌ | ✔ | ✔ |