typeid运算符

typeid运算符是Run-time Type Identification,RTTI的一部分

  1. #include<typeinfo>
  2. inline const char* num_sequence::
  3. what_am_i()const {
  4. return typeid(*this).name();
  5. }
  • typeid运算符返回一个type_info对象,其中储存着与类型相关的种种信息。
  • 每一个多态类(polymorphic class),如Fibonacci、Pell等等,都对应一个type_info对象,该对象的name()函数返回一个const char*,用以表示类名。
  • type_info对象可以进行比较操作

    类型转换机制

    1. num_sequence *ps=&fib;
    2. ps->gen_elems(64);//基于多态和虚函数的机制,可以调用Fibonacci类中的函数
    3. ps->Fibonacci::gen_elems(64)//错误,class scope运算符掩盖了虚函数机制,
    4. //这里会使用静态绑定,但是ps是基类运算符,无法访问到派生类的成员函数

    可以通过类型转换,将指针转换成想要的类型

  • static_cast无条件转换,编译器无法确定转换是否完全合法

    1. Fibonacci* pf=static_cast<Fibonacci*>(ps);
  • dynamic_cast,也是一个RTTI运算符,他会在运行时检验,若是转换对象ps指向目标Fibonacci,那么转换发生,否则返回0

    1. if(Fibnacci* ps=dynamic_cast<Fibonacci*>(ps))
    2. ps->gen_elems(64);

    小结

  • typeid运算符可以在运行时鉴别指针指向的派生类究竟是哪一个

  • 静态转换有风险,动态转换运行时进行鉴定;