C++ RTTI(runtime type information)讲的比较清楚的一篇文章

RTTI_线上幽灵的博客-CSDN博客_rtti

RTTI,即 Run-Time Type Identification

在C++ 中,也称为 运行时类型识别
这里写图片描述
RTTI 的体现方式:
这里写图片描述
看如下实例

定义一个Flyable 类,其中有两个纯虚函数:takeoff() 和 land()
C++ RTTI(runtime type information)讲的比较清楚的一篇文章_第1张图片
再定义一个Bird 类,它 public 的继承了 Flyable 类,并实现了 takeoff() 和 land(),并拥有自己独有的函数:foraging(),即觅食
C++ RTTI(runtime type information)讲的比较清楚的一篇文章_第2张图片
再定义一个Plane 类,它 public 的继承了 Flyable 类,并实现了 takeoff() 和 land(),并拥有自己独有的函数:carry(),即 运输
C++ RTTI(runtime type information)讲的比较清楚的一篇文章_第3张图片
在使用时:
C++ RTTI(runtime type information)讲的比较清楚的一篇文章_第4张图片
假设有这样一个函数:doSomething(),其参数是 Flyable 的一个指针,在函数体中可以使用obj 去调用 takeoff() 和 land()。

再设想一下,如果能够对传入的指针再做进一步的判断,即:

  • 如果判断它是一个Bird 的对象指针,就能使用指针去调用 觅食 的函数

  • 如果判断它是一个Plane 的对象指针,就能使用指针去调用 运输 的函数

如果想要做到上述判断,就要使用RTTI 运行时类型识别
C++ RTTI(runtime type information)讲的比较清楚的一篇文章_第5张图片
typeid(*obj).name() 可以获得当前 obj 指针指向的实际的对象类型,用cout 可以将其打印出来,再通过 if 语句进行比对,比对完成后,就可以将obj 通过 dynamic_cast 的方式将其转化成为 bird 的指针 。

转化时要注意:dynamic_cast 后面跟两个尖括号,中间写上要转化的目标类型。

总结:

关于 dynamic_cast 的注意事项:

  • 只能应用与指针和引用的转换,即只能转化为某一个类型的指针或某一个类型的引用,而不能是某类型本身

  • 要转化的类型中必须包含虚函数,如果没有虚函数,转换就会失败

  • 如果转换成功,返回子类的地址,如果转换失败,返回NULL

关于 typeid 的注意事项:

  • typeid 返回一个 type_info 的对象引用

  • 如果想通过基类的指针指向派生类的数据类型,基类就必须要带有虚函数,否则,在使用typeid 时,就只能返回定义时所使用的数据类型

  • typeid 只能获取对象的实际类型,即便这个类含有虚函数,也只能判断当前对象是基类还是派生类,而不能判断当前指针是基类还是派生类

你可能感兴趣的:(c++)