- Point< float >* ptr=0;
程序中什么都没发生,因为一个指向class object的指针,本身并不是一个class object,编译器不需要知道与该class有关的任何members的数据或object布局数据,所以将一个“Point的一个float实例”实例化也就没有必要了
如果是引用呢,假设const Point< float >&ref = 0; 它真的会实例化一个“Point的float实例”,因为reference并不是无物的代名词,0被视为整数,必须被转化为以下类型的一个对象:Point< float >,如果没有转换的可能,这个定义就是错的,将会在编译时被挑出来 - dynamic_cast运算符可以在执行期决定真正的类型,如果downcast时安全的(也就是说base type pointer指向一个derived class object),这个运算符会传回被适当转换过的指针,如果downcast不是安全的,这个运算符返回0
- virtual table的第一个slot内含type_info object的地址:此type_info object与指针所指的class type有关
- 对于dynamic_cast,一个reference不可以像指针那样“把自己设为0便代表了no object”,若将一个reference设为0,会引起一个临时性对象(拥有被参考到的类型)被产生出来,该临时对象的初值为0,这个reference然后被设定为该临时对象的一个别名。因此当dynamic_cast作用于reference时,不能提供像指针一样的true或false,取而代之的是:
如果reference真正参考到适当的derived class,downcast会被执行而程序可以继续执行
如果reference不是真正某一种derived class,会抛出一个bad_cast_exception - typeid运算符传回一个const reference,类型为type_info
- typeid也适用与内置类型,typeid(double)…;会传回一个const type_info&,与使用多态类型的差异在于这时候的type_info object是静态取得,而不是执行期取得
深度探索C++对象模型笔记 —— 第七章
最新推荐文章于 2022-06-25 17:10:53 发布