派生类转换到基类的可访问性
1.如果是 public 继承,则用户代码和后代类都可以使用派生类到基类的转换。
2.如果类是使用 private 或 protected 继承派生的,则用户代码不能将派生类型对象转换为基类对象。
3.如果是 private 继承,则从 private 继承类派生的类不能转换为基类。
4.如果是 protected 继承,则后续派生类的成员可以转换为基类类型。
无论是什么派生访问标号,派生类本身都可以访问基类的 public 成员,因此,派生类本身的成员和友元总是可以访问派生类到基类的转换。
对于1,我能明白,
对于2,我觉得是因为private,protected继承过来,基类的public也成为派生类的protected,private,所以不能转换
对于3,继承类派生的类不能转换为基类,我没有明白,什么是说类不能转换成基类,这个和对象的转换有什么区别?
对于4,后续派生类的成员可以转换为基类类型,这个也没有明白什么意思,派生类自己也能转为成基类是吗?
[解决办法]
bangding
[解决办法]
mark
[解决办法]
我的理解:
3)
class Base;
class Sub: private Base;
class Sub2: xxxxxx Sub;
则Sub2的对象不能转为Base对象。
4)
class Base;
class Sub: protected Base;
class Sub2: xxxxxx Sub;
则Sub2的对象(可能)可以转为Base对象。
[解决办法]
public继承才称为多态方法,private,protect称为实现。
[解决办法]
上面说了private,protect称为实现。
其实比较容易理解的是,如果是私有继承,那么基类的public方法在派生类中也为private,也就不能够被外部使用;所谓转换,应该是说能够把派生类当作基类使用,能够把派生类对象当作基类对象使用;在私有继承的情况下,这一点显然就不成立了。因为,基类可用的方法不再可用。
[解决办法]
实证检验全部正确
连同第5点
5. 无论是什么派生访问标号,派生类本身都可以访问基类的 public 成员,因此,派生类本身的成员和友元总是可以访问派生类到基类的转换。
- C/C++ code
class c00{private: int c00a;};class c10 : public c00{private: int c10a;public: void f(const c00 & c) //1 ok { }};class c11 : protected c00{private: int c11a;public: void f(const c00 & c) //5 ok { }};class c12 : private c00{private: int c12a;public: void f(const c00 & c) //5 ok { }};class c21 : public c11{private: int c21a;public: void f(const c00 & c) //4 ok { }};class c22 : public c12{private: int c22a;public: void f(const c00 & c) //3 error { }};void f(const c00 & c){}void main(){ c10 t10; c11 t11; c12 t12; f(t10); //1 ok f(t11); //2 error f(t12); //2 error} 