第一章 关于对象

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并不会被初始化或改变?这也是一个问题,后续有解释

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值