派生类到基类转换的可访问性

bear234 2014-12-13 10:15:29
对下面这段源自 c++ primer 的一小段话,我研究了半个多小时,总算是大概理解了,但还是有个地方不清楚,特来求教:

如果是public继承,则用户代码和后代码类都可以使用派生类到基类的转换。
如果类是使用private或protected继承派生的,则用户代码不能将派生类型对象转换为基类对象。
如果是private继承,则从private继承类派生的类不能转换为基类。
如果是protected继承,则后续派生类的成员可以转换为基类类型。

这段话一共四句,第一句很好理解,第四句也理解了。
关键是第二句和第三句:
我是这样理解的:
不论继承的层次有几层(A继承B,B继承C......),只要第一层的继承关系是private或者protected的,后续的所有子类,子类的子类......都不能转换为基类。

我觉得第二句和第三句都是这个意思,可如果是这样的话,为什么要写成两句话?或者说为什么还特别用第三句强调一下private?

求高人指点下,对于这个第二句和第三句,我到底哪儿理解错了~~
...全文
180 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
勤奋的小游侠 2014-12-13
  • 打赏
  • 举报
回复
你应该是没有搞懂“用户代码”和类内部的代码的区别。 这二句的重点是到底那些代码在对他们做转换,是类代码还是外部代码。
动力风暴 2014-12-13
  • 打赏
  • 举报
回复
这是《C++大学教程》第七版,继承章节本章总结的一段话:
scy2510 2014-12-13
  • 打赏
  • 举报
回复
楼主偿试把英文原版描述对照贴出来理解吧 比如只看中文我是这样理解的 假设A派生B再派生C再派生D 如果B是public继承A,则用户代码和后代码类(C,D....)都可以使用派生类到基类(A)的转换。 如果类B是使用private或protected继承A派生的,则用户代码不能将派生类型对象(BObject)转换为基类对象AObject。 如果B是private继承A,则从private继承类B派生的类(C,D....)不能转换为基类A。 如果B是protected继承A,则后续派生类(C,D....)的成员(应该是对象吧)可以转换为基类类型A。 四句话有区别的 在VC2005测试 只要是PROTECT继承的B,转化为B出现错误:从“C *__w64 ”到“A *”的转换存在,但无法访问
bear234 2014-12-13
  • 打赏
  • 举报
回复
引用 4 楼 lovesmiles 的回复:
你应该是没有搞懂“用户代码”和类内部的代码的区别。 这二句的重点是到底那些代码在对他们做转换,是类代码还是外部代码。
恩...... 我又在网上找了找,有一点我没有从这四句话里读出来,就是: 如果是private继承,那么继承出的类(B) 的派生类(C) 里不能有基类(A)类型的数据成员 比如: class A; class B : private A; class C : public B { A a; //报错 }; 难道第三句话是这个意思?是说类内部的代码不能有基类类型的数据? 这一点我有点想不明白,这和类里面是什么类型的数据有什么关系呢? 在这种情况下,C类型的对象不能转换成A类型的,我可以理解,但为什么C里面都不能有A类型的数据呢?
bear234 2014-12-13
  • 打赏
  • 举报
回复
引用 9 楼 xiaobing307 的回复:
问问lz,这些话在c++ primer上多少页?
c++ primer 中文版第四版 489页 中间部分:3. 派生类到基类转换的可访问性
xiaobing307 2014-12-13
  • 打赏
  • 举报
回复
问问lz,这些话在c++ primer上多少页?
zhousitiaoda 2014-12-13
  • 打赏
  • 举报
回复
不论继承的层次有几层(A继承B,B继承C......),只要第一层的继承关系是private或者protected的,后续的所有子类,子类的子类......都不能转换为基类。 如果是protected继承,则后续派生类的成员可以转换为基类类型。 你不觉得这2句有点矛盾吗
bear234 2014-12-13
  • 打赏
  • 举报
回复
引用 4 楼 lovesmiles 的回复:
你应该是没有搞懂“用户代码”和类内部的代码的区别。 这二句的重点是到底那些代码在对他们做转换,是类代码还是外部代码。
这个区别我搞懂了 但我觉得第二句和第三句都是针对用户代码的
bear234 2014-12-13
  • 打赏
  • 举报
回复
引用 2 楼 scy2510 的回复:
楼主偿试把英文原版描述对照贴出来理解吧 比如只看中文我是这样理解的 假设A派生B再派生C再派生D 如果B是public继承A,则用户代码和后代码类(C,D....)都可以使用派生类到基类(A)的转换。 如果类B是使用private或protected继承A派生的,则用户代码不能将派生类型对象(BObject)转换为基类对象AObject。 如果B是private继承A,则从private继承类B派生的类(C,D....)不能转换为基类A。 如果B是protected继承A,则后续派生类(C,D....)的成员(应该是对象吧)可以转换为基类类型A。 四句话有区别的 在VC2005测试 只要是PROTECT继承的B,转化为B出现错误:从“C *__w64 ”到“A *”的转换存在,但无法访问
你觉得第二句和第三句有区别?我怎么觉得第二句包含了第三句? B : XXXX A C : public B 不论XXXX是private还是protected,C以及C的子类都不能转换成A------这是第二句的意思 当XXXX是private时,C以及C的子类都不能转换成A----------这是第三句的意思 我这么说错了吗?
bear234 2014-12-13
  • 打赏
  • 举报
回复
引用 1 楼 zhousitiaoda 的回复:
不论继承的层次有几层(A继承B,B继承C......),只要第一层的继承关系是private或者protected的,后续的所有子类,子类的子类......都不能转换为基类。 如果是protected继承,则后续派生类的成员可以转换为基类类型。 你不觉得这2句有点矛盾吗
不矛盾 一个是说类本身不能转换为基类 另一个是说类内的数据成员可以做子类到基类的转换
fly_dragon_fly 2014-12-13
  • 打赏
  • 举报
回复
我记得这里应该是只有3句话的,现在翻译成4句了吗? 假设D 继承于B 1) 用户代码可以从派生类转换到基类仅当D pulbic 继承于B, 而protected或private继承不能转换。 2) D 的成员函数和友元可以转换到基类B,它忽略何种继承 3) D派生类的成员和友元可以转换到基类B,仅当D 以public 或protected 继承于B, 而private继承则不能转换。

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧