关于执行期类型信息,可能大多数朋友比较陌生,确实我们在平时的编程过程中很少使用,那么所谓的执行期类型信息到底是什么呢?
其实说穿了也很简单,单单从名称上已经说的很清楚了。就是在程序执行过程中知道某个对象是属于哪一种类型。执行期类型信息(Runtime Type Information,RTTI)在较先进的编译器(如Visual C++4.0)之后都广泛支持。
下面还是用一段代码来说明一下:
#include <typeinfo.h> //执行类型信息的头文件
#include <iostream.h>
#include <string.h>
首先是基类声明
class graphicImage
{
protected:
char name[80];
public:
graphicImage()
{
strcpy(name, "graphicImage");
}
virtual void display()
{
cout<<"Display a generic image." <<endl;
}
char* getName()
{
return name;
}
};
//子类
class GIFimage : public graphicImage
{
public:
GIFimage()
{
strcpy(name, "GIFimage");
}
void display()
{
cout << "Display a GIF file." <<endl;
}
};
class PICTimage : public graphicImage
{
public:
PICTimage()
{
strcpy(name, "PICTimage");
}
void display()
{
cout << "Display a PICT file. " << endl;
}
};
void processFile(graphicImage * type)
{
if (typeid(GIFimage) == typeid( *type)) //*********RTTI应用
{
((GIFimage *)type) ->display();
}
else if (typeid( PICTimage) == typeid(*type))
{
((PICTimage *)type) ->display();
}
else
cout << "Unknow type! " << (typeid(*type)).name() << endl;
}
void main()
{
graphicImage *gImage = new GIFimage();
graphicImage *pImage = new PICTimage();
processFile(gImage);
processFile(pImage);
}
执行结果如下:
Display a GIF file.
Display a PICT file.
这个程序与RTTI相关的地方有三个:
1、编译时需选用 /GR选项(/GR的意思是enable C++ RTTI)
2、载入typeinfo.h
3、新的typeid云算子。参数可以是类名称,也可以是对象指针。
MFC的RTTI能力牵扯到一组非常神秘的宏(DECLARE_DYNAMIC、IMPLEMENT_DYNAMIC)和一个非常神秘的类(CRuntimeClass)。下面会有介绍。