我们知道,派生类的对象可以直接访问基类的成员,这是因为派生类实际上是包含基类的,而基类的成员将会排列在靠前的位置。如果这时候要将派生类转换成基类,派生类自己的成员将会被截掉。
动手写8.7.4
动手写8.7.4展示了将派生类放进基类的容器中的情况。运行结果如图8.7.3所示:
图8.7.3 派生类到基类的转换
我们可以看到,派生类在放进基类的容器时发生了强制转换,大小从8变成了4,也就是基类中一个成员变量的大小。这个时候我们就无法访问派生类的成员d了,因为这个对象当前的类型是Base。
动手写8.7.4中所表现的基类与派生类的关系可用图8.7.4来表示:
(www.xing528.com)
图8.7.4 派生类的结构
基类作为派生类的一部分存在,两部分唯一占用空间的就是两个整型的成员变量。
派生类可以转换为基类,那么基类是不是能够反过来转换为派生类呢?答案是既可以又不可以。因为派生类肯定拥有基类的内容,所以可以转换为基类;而基类却不具备派生类的成员,所以不能直接转换为派生类。但是我们可以用指向基类的指针指向派生类,然后在确定当前类的类型时将基类指针转换成派生类的指针。这样讲有些抽象,我们还是来看一个示例:
动手写8.7.5
动手写8.7.5展示了从基类指针到派生类指针的转换。运行结果如图8.7.5所示:
图8.7.5 基类指针到派生类指针的转换
示例先将一个派生类赋值给了基类指针,然后又将基类指针强制转换回派生类指针。我们可以看到,在这个过程中派生类是没有丢失自己的成员的,在这个情况下我们知道对象属于什么类型,就可以安全地进行转换。但在实际编程中,这样的做法还是十分危险的,除非我们给类的每个对象一个标识符以标识它们的类型。需要注意的是,这个basePtr指向的对象大小是4而不是8,这是因为系统在这个时候只有指针的类型信息,还是把这个对象当成了基类,计算其大小时也是按照基类的大小计算,我们只需要记住它还保留了派生类的成员即可。
我们在实际编程中应该尽量使用指针来操作对象,这也是后面实现多态所需要的。在讲解多态的时候我们会介绍一种更安全的转换函数dynamic_cast。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。