派生类到基类变换的可访问性
派生类到基类转换的可访问性
对下面这段源自 c++ primer 的一小段话,我研究了半个多小时,总算是大概理解了,但还是有个地方不清楚,特来求教:
如果是public继承,则用户代码和后代码类都可以使用派生类到基类的转换。
如果类是使用private或protected继承派生的,则用户代码不能将派生类型对象转换为基类对象。
如果是private继承,则从private继承类派生的类不能转换为基类。
如果是protected继承,则后续派生类的成员可以转换为基类类型。
这段话一共四句,第一句很好理解,第四句也理解了。
关键是第二句和第三句:
我是这样理解的:
不论继承的层次有几层(A继承B,B继承C......),只要第一层的继承关系是private或者protected的,后续的所有子类,子类的子类......都不能转换为基类。
我觉得第二句和第三句都是这个意思,可如果是这样的话,为什么要写成两句话?或者说为什么还特别用第三句强调一下private?
求高人指点下,对于这个第二句和第三句,我到底哪儿理解错了~~
------解决思路----------------------
楼主偿试把英文原版描述对照贴出来理解吧
比如只看中文我是这样理解的
假设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 *”的转换存在,但无法访问
对下面这段源自 c++ primer 的一小段话,我研究了半个多小时,总算是大概理解了,但还是有个地方不清楚,特来求教:
如果是public继承,则用户代码和后代码类都可以使用派生类到基类的转换。
如果类是使用private或protected继承派生的,则用户代码不能将派生类型对象转换为基类对象。
如果是private继承,则从private继承类派生的类不能转换为基类。
如果是protected继承,则后续派生类的成员可以转换为基类类型。
这段话一共四句,第一句很好理解,第四句也理解了。
关键是第二句和第三句:
我是这样理解的:
不论继承的层次有几层(A继承B,B继承C......),只要第一层的继承关系是private或者protected的,后续的所有子类,子类的子类......都不能转换为基类。
我觉得第二句和第三句都是这个意思,可如果是这样的话,为什么要写成两句话?或者说为什么还特别用第三句强调一下private?
求高人指点下,对于这个第二句和第三句,我到底哪儿理解错了~~
------解决思路----------------------
楼主偿试把英文原版描述对照贴出来理解吧
比如只看中文我是这样理解的
假设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 *”的转换存在,但无法访问