Welcome

首页 / 软件开发 / C++ / 如何在运行时确定对象类型(RTTI)

如何在运行时确定对象类型(RTTI)2011-04-22 vckbase NorthTibetRTTI 是“Runtime Type Information”的缩写,意思是:运行时类型信息。 它提供了运行时确定对象类型的方法。本文将简略介绍 RTTI 的一些背景知识、描述 RTTI 的概念,并通过具体例子和代码介绍什么时候使用以及如何使用 RTTI;本文还将详细描述两 个重要的 RTTI 运算符的使用方法,它们是 typeid 和 dynamic_cast。

其实,RTTI 在C++中并不是什么新的东西,它早在十多年以前就已经出现了。但是大多数 开发人员,包括许多高层次的C++程序员对它并不怎么熟悉,更不用说使用 RTTI 来设计和编 写应用程序了。

一些面向对象专家在传播自己的设计理念时,大多都主张在设计和开发中明智地使用虚拟 成员函数,而不用 RTTI 机制。但是,在很多情况下,虚拟函数无法克服本身的局限。每每 涉及到处理异类容器和根基类层次(如 MFC)时,不可避免要对对象类型进行动态判断,也 就是动态类型的侦测。如何确定对象的动态类型呢?答案是使用内建的 RTTI 中的运算符: typeid 和 dynamic_cast。

首先让我们来设计一个类层次,假设我们创建了某个处理文件的抽象基类。它声明下列纯 虚拟函数:open()、close()、read()和 write():class File
{
public:
virtual int open(const string & filename)=0;
virtual int close(const string & filename)=0;
//
virtual ~File()=0; // 记住添加纯虚拟析构函数(dtor)
};

现在从 File 类派生的类要实现基类的纯虚拟函数,同时还要提供一些其他的 操作。假设派生类为 DiskFile,除了实现基类的纯虚拟函数外,还要实现自己的flush()和 defragment()操作:class DiskFile: public File
{
public:
int open(const string & filename);
// 实现其他的纯虚拟函数
......
// 自己的专有操作
virtual int flush();
virtual int defragment();
};

接着,又从 DiskFile 类派生两个类,假设为 TextFile 和 MediaFile。前者 针对文本文件,后者针对音频和视频文件:class TextFile: public DiskFile
{
// ......
int sort_by_words();
};
class MediaFile: public DiskFile
{
//......
};

我们之所以要创建这样的类层次,是因为这样做以后可以创建多态对象,如:

File *pfile; // *pfile的静态类型是 File
if(some_condition)
pfile = new TextFile; // 动态类型是 TextFile
else
pfile = new DiskFile; // 动态类型是 DiskFile