运行时类型信息 (RTTI)

dynamic_cast

  • 用于多态类型的转换

typeid

  • typeid 运算符允许在运行时确定对象的类型
  • type_id 返回一个 type_info 对象的引用
  • 如果想通过基类的指针获得派生类的数据类型,基类必须带有虚函数
  • 只能获取对象的实际类型

type_info

  • type_info 类描述编译器在程序中生成的类型信息。 此类的对象可以有效存储指向类型的名称的指针。 type_info 类还可存储适合比较两个类型是否相等或比较其排列顺序的编码值。 类型的编码规则和排列顺序是未指定的,并且可能因程序而异。
  • 头文件:typeinfo

typeid、type_info 使用

  1. class Flyable // 能飞的
  2. {
  3. public:
  4. virtual void takeoff() = 0; // 起飞
  5. virtual void land() = 0; // 降落
  6. };
  7. class Bird : public Flyable // 鸟
  8. {
  9. public:
  10. void foraging() {...} // 觅食
  11. virtual void takeoff() {...}
  12. virtual void land() {...}
  13. };
  14. class Plane : public Flyable // 飞机
  15. {
  16. public:
  17. void carry() {...} // 运输
  18. virtual void take off() {...}
  19. virtual void land() {...}
  20. };
  21. class type_info
  22. {
  23. public:
  24. const char* name() const;
  25. bool operator == (const type_info & rhs) const;
  26. bool operator != (const type_info & rhs) const;
  27. int before(const type_info & rhs) const;
  28. virtual ~type_info();
  29. private:
  30. ...
  31. };
  32. class doSomething(Flyable *obj) // 做些事情
  33. {
  34. obj->takeoff();
  35. cout << typeid(*obj).name() << endl; // 输出传入对象类型("class Bird" or "class Plane")
  36. if(typeid(*obj) == typeid(Bird)) // 判断对象类型
  37. {
  38. Bird *bird = dynamic_cast<Bird *>(obj); // 对象转化
  39. bird->foraging();
  40. }
  41. obj->land();
  42. };