对象切割,指针和引用对多态的支持

来源:互联网 发布:运营优化具体体现在 编辑:程序博客网 时间:2024/05/01 06:55

对象切割:

一般来说派生类分配的存储空间大于基类分配的存储空间,如果不通过指针和引用而是直接将派生类对象复制给基类对象就会造成切割。

切割导致无法通过基类调用基类的成员函数。
例子:

class Bear : public ZooAnimal{}

Bear b;ZooAnimal za = b; za.rotate();//调用ZooAnimal::rotate()

直接通过对象复制引起切割。也就是说多态所造成的“一个以上的类型”的潜在力量,也就是基类和多个派生类之间关系,并不能够实际发挥在“直接存取object”这件事情上。因此,OO程序设计并不支持对object的直接处理(《深度探索C++对象模型》)。

ZooAnimal za;ZooAnimal *pza;Bear b;pza = &b;
将za或者b的地址,指定给pza,没有问题。一个指针或引用之所以支持多态,是因为他们并不引发内存中任何"与类型有关的内存委托操作“。会受到改变的只有他们所指向的内存的”内容和解释方式“。

但是当把一个基类直接初始化为一个派生类时,派生类会被切割以塞入较小的基类中,因此多态就不存在。因为切割后包含内容不同。如下:

Bear b;ZooAnimal  *pz = &b;Bear *pb = &b;
他们每个都指向Bear object的第一个byete. 其间的差别是,pb所涵盖的地址包含整个Bear obeject,而pz所涵盖的地址只是包含Bear 对象中的 ZooAnimal 实例。


0 0