运行时类型识别RTTI
run-time type identification。
RTTI主要用于在没有使用虚函数时希望用基类指针或用用执行某个派生类操作,虽然仍然希望能使用虚函数就使用虚函数。
dynamic_cast
e需与<>中的类型一致,type为类类型。
一般type应该是包含虚函数的类。
类型转换只能向本派生树上向上或向下或不动的公共类进行转化。若转换失败,指针返回0,引用抛出bad_cast,在类型转换后最好检查是否成功,指针if就可以检验了,而引用的则需要使用try并catch bad_cast(定义在typeinfo中)。
可以对空指针执行dynamic_cast、
typeid运算符
使用typeid(variable),返回一个常量对象的引用,类型时type_info或其共有派生类型。这里的variable甚至可以使表达式,另外,忽略顶层const和引用,并且不会将数组或函数转为指针。
当对象不虚时,将返回静态类型。否则知道运行后才能知道真正的动态类型。
typeid里面的还可以是类型名。
如果typeid的表达式是动态类型,则在运行时必将求值并通过结果来获取类型,而若是静态类型在编译时就能通过类型之间的运算即可得出结果,因此静态类型无需要求其有效,但动态类型需要。
RTTI的用处
如在继承体系中想重载=,但是由于虚函数的参数需与基类的对应函数相同,因此传入的只能是基类的引用,因此需要typeid处理不同类型之间的比较和dynamic_cast来进行转换比较派生类独有的部分。
type_info
type_info没有默认构造函数,并且拷贝和移动构造函数都被定义为删除的,因此只有可能通过typeid获取type_info对象。
name()返回的名字不一定与程序中使用的名字一致,对于其返回的唯一要求就是类型不同返回的字符串也要不同。
运行时类型识别RTTI
https://lhish.github.io/project/hide/运行时类型识别RTTI/