深度探索C++对象模型笔记 —— 第一章

  1. C++在布局以及存取时间上主要的额外负担是由virtual引起的,包括虚函数和虚继承
  2. 多态是通过指针或引用来完成的
    Librarary_meterials thing1;
     class Book:public Librarary_meterials {...};
     Book book;
     //thing1不是一个Book,book被裁切了,不过thing1仍保有一个Librarary_meterials 
     thing1=book;
     //调用的是Librarary_meterials :: check_in()
     thing1.check_in();
    
    Librarary_meterials &thing2=book;
    thing2.check_in();  //现在引发的是Book::check_in();
    
    //描述objects:不确定类型
    Librarary_meterials *px=retrieve_some_material();
    Librarary_meterials &rx=*px;
    //描述已知物:不可能有令人惊讶的结果
    Librarary_meterials dx=*px;
    
    没有办法确定地说出px或rx到底指向何种类型的objects,你只能说它要么是一个Librarary_meterials object,要么是它的一个子类型。不过,dx只能是Librarary_meterials 的一个object
  3. 指向不同类型的指针间的差异,既不在其指针表示法的不同,也不在其内容(代表一个地址)不同,而是在其所寻址出来的object类型不同。也就是说,“指针类型”会教导编译器如何解释某个待定地址中的内存内容及其大小。所以一个类型为void* 的指针只能够持有一个地址,而不能通过它操作所指的object的缘故。所以,cast大部分情况下不改变一个指针所含的真正地址,它只影响“被指出之内存的大小和其内容”的解释方式
  4. Bear b;
    ZooAnimal *pz=&b;
    Bear *pb=&b; 
    
    在这里插入图片描述
    它们都指向Bear object的第一个byte,其间的差别是,pb所涵盖的地址包含整个Bear object,而pz所涵盖的地址只包含Bear object中的ZooAnimal subobject
    //cell_block是Bear的成员变量,不是ZooAnimal的
    //所以下面调用不合法
    pz->cell_block;
    //ok,经过显示的downcast操作就没有问题
    (static_cast<Bear*> (pz))->cell_block;
    //下面这样更好,但它是一个run-time operator,成本较高
    if(Bear* pb2=dynamic_cast<Bear*>(pz))
    pb2->cell_block;
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值