派生类(多级)到基类转换的可访问性
2015-11-15 17:01
369 查看
《C++primer》第四版 15.3.1节提到基类到派生类转换(无论ref/poniter or not)的可行性,有些拗口,根据英文版翻译,得到以下几个要点:
1.如果是 public 继承,则用户代码和后代类都可以使用派生类到基类的转换。
2.如果类是使用 private 或 protected继承派生的,则用户代码(即派生类对象)不能将派生类型对象转换为基类对象。
3.如果是 private 继承,则从 private 继承类派生的孙类不能转换为基类。
4.如果是 protected 继承,则从protected继承派生的孙类的成员函数可以转换本类为基类类型,但是不能想2那样由用户直接转换。
5.无论是什么派生访问标号,派生类本身都可以访问基类的 public 成员,因此,派生类本身的成员和友元总是可以访问派生类到基类的转换。
按照个人理解,重新归纳为一下:
首先假定基类a成员都是public的
(1)如果是public继承,那么如果类b是public继承基类a派生的时,则用户代码(对类的操作)和后代类(应该理解为派生类b的派生类c,同样也是public继承派生)都可以使用派生类到基类的转换。
(2)如果类是使用private或protected继承派生的,则用户代码(对类的操作)不能将派生类型对象(类b的实例)转换为基类对象(类a的实例)(因为基类a都是public类型的,而派生之后只能是private或者protected的,显然是不可以转换的)。
(3)如果是private继承,则从private继承类(此时基类在派生类b中的成员都是private类型的)派生的类(这个类c将会不可访问b中基类a中的成员,因为此时基类a中的成员在类b已经都是private的,类c不会继承类a的任何成员了)不能转换为基类。
(4)如果是protected继承,则后续派生类(类b的派生类c)的成员(成员函数,借助自身成员函数实现)可以转换为基类类型(类a)(因为protected继承,自然派生类可以对基类成员进行访问的,派生类中自然继承基类中的成员,只是访问限制改为了protected)(!!!如果直接对类c转换成类a,是不可以的!!!见(2))。
有时间再写程序测试一下~
1.如果是 public 继承,则用户代码和后代类都可以使用派生类到基类的转换。
2.如果类是使用 private 或 protected继承派生的,则用户代码(即派生类对象)不能将派生类型对象转换为基类对象。
3.如果是 private 继承,则从 private 继承类派生的孙类不能转换为基类。
4.如果是 protected 继承,则从protected继承派生的孙类的成员函数可以转换本类为基类类型,但是不能想2那样由用户直接转换。
5.无论是什么派生访问标号,派生类本身都可以访问基类的 public 成员,因此,派生类本身的成员和友元总是可以访问派生类到基类的转换。
按照个人理解,重新归纳为一下:
首先假定基类a成员都是public的
(1)如果是public继承,那么如果类b是public继承基类a派生的时,则用户代码(对类的操作)和后代类(应该理解为派生类b的派生类c,同样也是public继承派生)都可以使用派生类到基类的转换。
(2)如果类是使用private或protected继承派生的,则用户代码(对类的操作)不能将派生类型对象(类b的实例)转换为基类对象(类a的实例)(因为基类a都是public类型的,而派生之后只能是private或者protected的,显然是不可以转换的)。
(3)如果是private继承,则从private继承类(此时基类在派生类b中的成员都是private类型的)派生的类(这个类c将会不可访问b中基类a中的成员,因为此时基类a中的成员在类b已经都是private的,类c不会继承类a的任何成员了)不能转换为基类。
(4)如果是protected继承,则后续派生类(类b的派生类c)的成员(成员函数,借助自身成员函数实现)可以转换为基类类型(类a)(因为protected继承,自然派生类可以对基类成员进行访问的,派生类中自然继承基类中的成员,只是访问限制改为了protected)(!!!如果直接对类c转换成类a,是不可以的!!!见(2))。
有时间再写程序测试一下~
相关文章推荐
- 如何替换Theme developer 模块手工查找命名需要覆写模块的名称?
- bochs上网及配置
- Android Studio的使用(八)--// TODO代码
- 软件功能测试——基础理论篇
- [C++] Vtable(虚函数表)
- 转换 Github-Favored Markdown 成 PDF
- 理解数据库范式——通俗易懂
- GDAL/OGR 1.9.0获取shp文件中中文字段值和属性值乱码文件解决
- jdk安装环境配置
- Python字符串
- System.Linq.Dynamic的使用
- margin属性
- 用C++11学习多线程
- 缺?
- 记 Integer 的一个小坑
- 记录一个关于互联网、网页设计、Web开发、服务器运维优化、项目管理、网站运营、网站安全的网站
- Git与Repo入门
- 最短路 dijskal
- 【郝斌数据结构自学笔记】1-4_数据结构定义及特点
- 单词翻转