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

派生类转换到基类的可访问性1.如果是 public 继承,则用户代码和后代类都可以使用派生类到基类的转换。2.如

派生类转换到基类的可访问性
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}