- C++在布局以及存取时间上主要的额外负担是由virtual引起的,包括虚函数和虚继承
- 多态是通过指针或引用来完成的
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();
没有办法确定地说出px或rx到底指向何种类型的objects,你只能说它要么是一个Librarary_meterials object,要么是它的一个子类型。不过,dx只能是Librarary_meterials 的一个object//描述objects:不确定类型 Librarary_meterials *px=retrieve_some_material(); Librarary_meterials &rx=*px; //描述已知物:不可能有令人惊讶的结果 Librarary_meterials dx=*px;
- 指向不同类型的指针间的差异,既不在其指针表示法的不同,也不在其内容(代表一个地址)不同,而是在其所寻址出来的object类型不同。也就是说,“指针类型”会教导编译器如何解释某个待定地址中的内存内容及其大小。所以一个类型为void* 的指针只能够持有一个地址,而不能通过它操作所指的object的缘故。所以,cast大部分情况下不改变一个指针所含的真正地址,它只影响“被指出之内存的大小和其内容”的解释方式
-
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;
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交