Bear = b;
ZooAnimal za = b;//引起切割
//调用ZooAnimal::rotate()
za.rotate();
原文中“ 为什么rotate所调用的是ZooAnimal实体而不是Bear实体?此外,如果初始化函数(应用于上述assignment操作发生时)将一个object内容完整拷贝到另一个object中去,为什么za的vptr不指向Bear的virtual table?
第二个问题的答案是,编译器在(1)初始化及(2)指定(assignment)操作之间做出了仲裁。编译器必须确保如果某个object含有一个或一个以上的vptrs,那些vptrs的内容不会被base class object初始化或改变。至于第一个问题,za并不是一个Bear,它是一个ZooAnimal。多态所造成的“一个以上的类型”的潜在力量,并不能够发挥在“直接存取对象””
对于问题一,我的理解是:因为za肯定是一个ZooAnimal对象,而多态是在指针或引用在不明确对象类型的情况下才会发生的,此时的情况明确为ZooAnimal类型,所以仍然调用ZooAnimal::rotate()。
对于问题二,书上的解释是在对象初始化时,虚函数指针vptr并不会被初始化或改变,这确实解释了“为什么za的vptr不指向Bear的virtual table?”,但是为什么在对象初始化时,虚函数指针vptr并不会被初始化或改变?这也是一个问题,后续有解释