派生类(多级)到基类转换的可访问性

《C++primer》第四版 15.3.1节提到基类到派生类转换(不管ref/poniter or not)的可行性,有些拗口,根据英文版翻译,获得如下几个要点:函数

1.若是是 public 继承,则用户代码和后代类均可以使用派生类到基类的转换。测试

2.若是类是使用 private 或 protected继承派生的,则用户代码(即派生类对象)不能将派生类型对象转换为基类对象。spa

3.若是是 private 继承,则从 private 继承类派生的孙类不能转换为基类。翻译

4.若是是 protected 继承,则从protected继承派生的孙类的成员函数能够转换本类为基类类型,可是不能想2那样由用户直接转换。对象

5.不管是什么派生访问标号,派生类自己均可以访问基类的 public 成员,所以,派生类自己的成员和友元老是能够访问派生类到基类的转换。继承

 

按照我的理解,从新概括为一下:it

 首先假定基类a成员都是public的class

(1)若是是public继承,那么若是类b是public继承基类a派生的时,则用户代码(对类的操做)和后代类(应该理解为派生类b的派生类c,一样也是public继承派生)均可以使用派生类到基类的转换。程序

(2)若是类是使用private或protected继承派生的,则用户代码(对类的操做)不能将派生类型对象(类b的实例)转换为基类对象(类a的实例)(由于基类a都是public类型的,而派生以后只能是private或者protected的,显然是不能够转换的)。im

(3)若是是private继承,则从private继承类(此时基类在派生类b中的成员都是private类型的)派生的类(这个类c将会不可访问b中基类a中的成员,由于此时基类a中的成员在类b已经都是private的,类c不会继承类a的任何成员了)不能转换为基类。

(4)若是是protected继承,则后续派生类(类b的派生类c)的成员(成员函数,借助自身成员函数实现)能够转换为基类类型(类a)(由于protected继承,天然派生类能够对基类成员进行访问的,派生类中天然继承基类中的成员,只是访问限制改成了protected)(!!!若是直接对类c转换成类a,是不能够的!!!见(2))。  

 

有时间再写程序测试一下~

相关文章
相关标签/搜索