深度探索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; 
    
    深度探索C++对象模型笔记 —— 第一章_第1张图片
    它们都指向Bear object的第一个byte,其间的差别是,pb所涵盖的地址包含整个Bear object,而pz所涵盖的地址只包含Bear object中的ZooAnimal subobject
    //cell_block是Bear的成员变量,不是ZooAnimal的
    //所以下面调用不合法
    pz->cell_block;
    //ok,经过显示的downcast操作就没有问题
    (static_cast (pz))->cell_block;
    //下面这样更好,但它是一个run-time operator,成本较高
    if(Bear* pb2=dynamic_cast(pz))
    pb2->cell_block;
    

你可能感兴趣的:(深度探索C++对象模型)