当前位置:C++技术网 > 精选软件 > 关于父子对象相互赋值以及多态特性的分析:5 用父类指针接受子类对象的理解

关于父子对象相互赋值以及多态特性的分析:5 用父类指针接受子类对象的理解

更新时间:2017-08-23 09:08:51浏览次数:1+次

    接上篇。。。。

    

    6.将子类对象传给父类指针,然后再转为子类对象的理解

    有这样的需求,我们在传递对象的时候,需要将子类对象通过父类指针传出去,然后再根据需要还原为原来的子类对象。通过前面的分析,如果我们使用父类对象来接受子类对象,那么会导致数据的丢失,最后无法还原子类对象。
    那么使用父类指针为什么就可以还原呢?当我们使用父类指针来接收子类对象时,这个没有问题。因为父类指针只是指向了子类的对象的内存的起始地址。我们再从父类指针转回为子类对象的时候,只要按照子类的类型转换为子类,就可以得到正确的子类对象。在开始将子类对象的地址传给父类指针的时候,也只是给了父类指针一个起始地址而已,而且父类指针指向的内存范围也是只有子类对象内存范围的一部分。也就是说,此时的父类指针并有指向完整的子类对象。当我们再将父类指针转为子类指针的时候,一切就变得合理了。
    通过这样的方式,我们可以通过父类指针作为函数的返回值类型,将不同的子类对象传出来,然后再还原使用。这种做法非常常见,一般用在对象工厂里。但是我们需要注意一个问题,传出去的对象不能是局部对象,否则函数执行完之后对象被析构,后续的还原使用就崩溃了。所以,我们可以将这些要返回的对象定义为全局对象或者类成员对象变量或者是static静态对象。
    我们来看看代码:
AA aa;
A *pa = &aa;
pa->show();
AA aa1 = *((AA*)pa);
aa1.show();
    这个过程就有一个父类指针指向子类对象,然后再通过指针类型转换改变指针所指的范围,然后再取得对象。我们这里的类型转换必须是指针类型,对象类型是无法转换的。父类对象转为子类对象是有缺陷的,因为父类对象没有子类新增的内容。这样转为子类后,新增的内容就是空白,那么这个子类对象就是先天有缺陷的。但是我们通过指针就可以绕过这个机制,但是需要自己保证正确性。
    那么“关于父子对象相互赋值以及多态特性的分析”就说到这了,这些基础的知识非常有用,而不是简单的理论知识。请不要掉以轻心。
        完结。