回顾C++:访问权限控制之 公有、保护、私有继承用法详解与总结
2020-10-29 19:04
204 查看
理解
- 类的成员的访问控制说明符:主要用于控制派生类成员对基类成员的访问权限
- 类的派生访问说明符:主要用于控制派生类实例对基类的成员访问权限
- 公有继承 -> 保护继承 -> 私有继承, 派生类实例对基类成员的访问权限束缚依次加强。除公有继承外,保护继承相当于重置基类公有成员为保护成员,私有继承相当于重置基类公有成员和保护成员为私有成员。
主要用法
1. 阻断当前类实例对父类所有成员的访问权限
class Per { public: Per() = default; int pubPer = 1; protected: int protPer = 1; private: int prvPer = 1; }; class Stu: protected Per { public: Stu() = default; int pubStu = 1; protected: int protStu = 1; private: int priStu = 1; }; class Monitor: public Stu { public: Monitor() = default; int pubMonitor = 1; protected: int protMonitor = 1; private: int priMonitor = 1; }; int main () { Stu s; Monitor m; s.pubPer++; // error line s.protPer++; // error line m.pubPer++; // error line m.protPer++; // error line return 0; }
当 保持Monitor公有继承于Stu 时: 若 Stu 保护继承于 Per, 则 Stu中对 Per中的公有成员访问权限被重置为protected,即 Stu 的实例不能再访问 Per 中的公有成员, 也就是Stu实例无法访问Per中的任何成员,Monitot实例也一样无法访问。 同理,若Stu 私有继承于 Per 也能实现相似的限制效果。即阻断Stu类向下(包括Stu)的所有类的实例对基类所有成员的访问。
2. 实现用法1的效果的同时,阻断派生类的派生类成员对基类所有成员的访问
class Per { public: Per() = default; int pubPer = 1; protected: int protPer = 1; private: int prvPer = 1; }; class Stu: private Per { public: Stu() = default; int pubStu = 1; protected: int protStu = 1; private: int priStu = 1; }; class Monitor: public Stu { public: Monitor() = default; int pubMonitor = 1; void watch () { pubPer++; // error line } protected: int protMonitor = 1; private: int priMonitor = 1; }; int main () { Stu s; Monitor m; s.pubPer++; // error line s.protPer++; // error line m.pubPer++; // error line m.protPer++; // error line return 0; }
3. 限制派生类类型 到 基类类型的转换
class Per { public: Per() = default; }; class Stu: protected Per { public: Stu() = default; }; int main () { Stu s; Per p = s; // error line return 0; }
4. 实现用法3的效果的同时,限制派生类的派生类及其友元 实现 派生类类型 向 基类类型的转换
即对某个特定作用域来说,如若基类中的公有成员可访问,则能够实现派生类类型到基类类型的转换。
class Per { public: Per() = default; void eat () {} }; class Stu: private Per { public: Stu() = default; void test () { Per p = *this; } private: Stu *thisS; }; class Monitor: public Stu { public: void test () { Stu s; Per p = s; // error line } }; int main () { Stu s; Per p = s; // error line return 0; }
通过派生访问说明符与成员访问说明符的配合,可以更加全面地实现各种应用场景。
相关文章推荐
- C++ 公有继承、保护继承和私有继承中类成员的访问权限的控制
- C++ 公有继承、保护继承和私有继承中类成员的访问权限的控制
- C++ 公有继承、保护继承和私有继承中类成员的访问权限的控制
- C++ 公有继承、保护继承和私有继承中类成员的访问权限的控制
- C++ 公有继承、保护继承和私有继承中类成员的访问权限的控制
- C++基类和派生类私有、保护、公有成员访问控制以及动态绑定、三种继承
- C++ 保护,私有继承,公有继承 ---访问属性--关系
- C++学习笔记14,private/protected/public继承,私有继承,保护继承,公有继承(五)(总结)
- C++公有保护私有继承方式权限
- C/C++ 公有继承、保护继承和私有继承的对比详解
- 对于C++中公有(public)、私有(private)、保护(protected),访问权限的一点总结
- C++第十四章_引入_包含(公有继承)和私有继承_is-a关系和has-a关系_私有继承_使用using重新定义获得访问权限_多重继承的问题与改进_虚基类_类模板类模板类模板_栈指针...
- C++学习笔记14,private/protected/public继承,私有继承,保护继承,公有继承(五)(总结)
- C++学习笔记14,private/protected/public继承,私有继承,保护继承,公有继承(五)(总结)
- C++基础知识: 公有继承,保护继承,私有继承的总结,私有继承的用意何在
- C++继承:公有,私有,保护
- C++ 继承 访问权限控制
- C++继承:公有,私有,保护
- C++继承:公有,私有,保护
- C++继承的三种方式(公有,私有,保护)