现在的位置: 首页 > 综合 > 正文

RTTI和4个强制转换运算符

2013年07月23日 ⁄ 综合 ⁄ 共 1018字 ⁄ 字号 评论关闭

因为虚函数/继承等等造成的C++的多态特性,使得C++程序在编译时没有办法确认每个对象的具体类型。

与之对应的,就必然提供一个方法在运行时用来判断对象的具体类型,也就是RTTI,运行时类型标识符。 

RTTI的编译器本质是在虚函数表中偷偷隐藏了一个指针,这个指针指向一个数据结构,这个数据结构记录了该类的真实类型信息。也就是typ_info。因为这个指针是藏在虚函数表中的,显而易见的:所有和动态类型判定有关系的都是对发生了虚继承(出现了virtual)的类的对象产生。

 

typeid

#include <typeinfo>
typeid(
object)

typeid(object)就是建立在RTTI之上的一个函数。它用来返回对象实际类型的信息,也就是一个type_info类对象的引用。

type_info类包含以下共有成员

bool opereator==(const type_info &ob);
bool opereator!=(const type_info &ob);
bool before(const type_info &ob);
const char *name();

typeid对多态类型才起作用。也就是类体系中,有virtual。 

从本质上说typeid是以RTTI为基础,没有virtual的类体系,在编译时即可确定类型,它们是不会被RTTI管辖的。

 

dynamic_cast

dynamic_cast<target-type> (expr)

dynamic_cast会判断expr能否被正确转换为target-type,也就是利用RTTI判断目标类型是不是expr的1)真实类型2)父类或3)祖..父类,是就强制转换。如果不是,就不转换,并抛出一个bad_cast。

 

const_cast

const_cast<type> (expr)

const_cast的意义根据语境有两个截然相反的两个

1)如果expr原先是const,则去除const;2)如果原先没有const,则加上const。

 

static_cast

也就是不执行类型检查的强制转换。可以看作跳过RTTI判断的dynamic_cast。效率提高。

在可以安全static_cast的地方不要dynamic_cast。但在不能保证安全处,一定要dynamic。

 

reinterpret_cast

啥也不管的在不相干的类型之间转化,例如指针转整数,或者不同类型的指针之间。 

 

 

抱歉!评论已关闭.