RTTI

  • RTTI的作用
    每个类对象都具有静态类型和动态类型,静态类型在编译的时候就已知,而动态类型在运行的时候才能确定。虽然有虚函数,但是虚函数有其局限性。
  • 实现
    RTTI的功能主要由两个运算符来实现,typeid运算符,用于返回表达式的类型。dynamic_cast运算符,用于将基类的指针或引用安全地转换成派生类的指针或引用。

  • 应用场景
    比如一个应用程序中有很多类型的文件,基类为File,并且下面很多派生类,比如文本文件TextFil,多媒体文件MediaFile,这些都是File的派生类。对于相同的功能,如删除,复制等,可以用虚函数实现,但对于不同的功能,如媒体MediaFile应该具有播放等功能,这时就要用到类型识别。如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void fun(File* file)
{

if(typeid(*file) == typeid(TextFile))
{
auto text_file = dynamic_cast<TextFile*>(file);
//相关操作
}
else if(typeid(*file) == typeid(MediaFile))
{
auto media_file = dynamic_cast<MediaFile*>(file);
//相关操作
}
else
{
//相关操作
}
}
  • type_info类
    type_info类定义在头文件typeinfo中,他没有默认构造函数,并且拷贝构造和移动构造以及赋值运算符都是删除的,因此我们无法定义type_info类的对象,也无法为其赋值,唯一途径就是通过typeid运算符得到。
    name()成员函数返回一个表示其类型的c风格字符串。