当前位置:C++技术网 > 精选软件 > 关于父子对象相互赋值以及多态特性的分析:3 子类和父类对象相互转化的理解

关于父子对象相互赋值以及多态特性的分析:3 子类和父类对象相互转化的理解

更新时间:2017-08-21 08:37:49浏览次数:1+次

        接上篇。。。。

    3.子类对象赋值给父类对象,然后父类对象再赋值给子类对象的理解

    我们再来看下面的代码:
AA aa;
A a = aa;
AA aa1 = a;

        请看这部分代码,我们已经知道,对象赋值并不会改变对象本身的结构。所以aa1还是AA类对象。因为在赋值的过程中,只是信息的传递,也就是变量的赋值而已。所以,将带有更多信息的aa对象赋值给a对象之后,多余的信息就丢失了。然后再将a对象赋值给aa1,也没法恢复被丢失的数据了。所以,这样的类型转换也是不可行的。父类对象赋值给子类对象在前面已经说明了不可行了。

    4.强行将父类对象赋值给子类对象的实现的理解
    直接的类型转换或者隐式的类型转换都是不可行的。即像下面的写法会报错:

AA a;
AA aa2 = (AA)a;
    或
AA a;
AA aa2 = a;
    我们来看下面一段代码:
AA a;
AA aa2 = *(AA*)&a;
aa2.show();
aa2.say();
    这段代码是可以编译通过的。和上面的代码有什么区别呢?区别就在于是如何进行类型转换的!我们这里使用指针。指针是一把锋利的宝剑,一出鞘就可以所向披靡。但是使用宝剑的时候,要小心,以免着魔误伤自己。
    基于常规的类型转换,编译器会拒绝转换。然而如果使用指针,则可以绕过编译器的阻碍。但是你要知道一点,超越了常规的套路,就要承担额外的风险。在使用的时候,要注意。指针给予你强大的能力,也给予你强大的破坏力。这一点都不假。
    我们来理解这一段代码的含义。因为对象a的内存只是aa2对象的一部分大小。所以自然没有办法提供aa2需要的所有的信息。前面说了这个叫做吃不饱。但是吃不饱还是可以凑合着吃的。但是我们要注意,没有被赋值的部分,是属于没有初始化的部分。所以对于没有初始化的部分的数据,我们是不能够直接使用的,我们还得提前自己额外的赋值处理一下。
    我们先将a取地址,将对象变成了对象地址,就可以进行指针类型的转换了。我们再用AA指针转换,此时就不存在类型问题了。转换为AA*类型指针之后,我们再取值为对象,此时就变成了AA类的对象。但是从a转换为AA类对象的a对象,并不会真的包含了AA类对象的所有东西。所以此时的指针使用不要超越a对象本身的范围,也就是不要访问AA类在A类的基础上额外添加的东西。但是我们这里是作为对象赋值给aa2对象。所以此时只是说AA类相对于A类额外的成员变量不会得到赋值,也就是未初始化的状态。知道这一点,我们就可以好好的使用aa2,也没有问题了。
    本系列未完,请继续阅读后续文章。。。