typeid运算符
typeid运算符是Run-time Type Identification,RTTI的一部分
#include<typeinfo>
inline const char* num_sequence::
what_am_i()const {
return typeid(*this).name();
}
typeid
运算符返回一个type_info
对象,其中储存着与类型相关的种种信息。- 每一个多态类(polymorphic class),如Fibonacci、Pell等等,都对应一个
type_info
对象,该对象的name()
函数返回一个const char*
,用以表示类名。 -
类型转换机制
num_sequence *ps=&fib;
ps->gen_elems(64);//基于多态和虚函数的机制,可以调用Fibonacci类中的函数
ps->Fibonacci::gen_elems(64)//错误,class scope运算符掩盖了虚函数机制,
//这里会使用静态绑定,但是ps是基类运算符,无法访问到派生类的成员函数
可以通过类型转换,将指针转换成想要的类型
static_cast
无条件转换,编译器无法确定转换是否完全合法Fibonacci* pf=static_cast<Fibonacci*>(ps);
dynamic_cast
,也是一个RTTI运算符,他会在运行时检验,若是转换对象ps指向目标Fibonacci,那么转换发生,否则返回0if(Fibnacci* ps=dynamic_cast<Fibonacci*>(ps))
ps->gen_elems(64);
小结
typeid运算符可以在运行时鉴别指针指向的派生类究竟是哪一个
- 静态转换有风险,动态转换运行时进行鉴定;