C++提供了两个操作符合一个类来实现运行时类型识别机制,它们是操作符dynamic_cast、操作符typeid和类type_info
dynamic_cast操作符:
dynamic_cast操作符可以将基类的指针安全地向下转型为派生类指针。
语法格式:
dynamic_cast<派生类 *>(基类指针)
安全转型是指,当基类指针实际指向的对象本身就是该派生类对象,或是由该派生类进一步派生出的子类对象时,上面的表达式将返回派生类指针;否则指针类型的转换就是危险的向下转型,这时表达式返回空指针。
例子:
Shape *sp = new Circle();
Circle *cp=dynamic_cast<Circle *>(sp); //安全的向下转型
Cylinder *cy = dynamic_cast<Cylinder *>(sp); //返回空指针
上面的语句中,由于基类Shape的指针sp实际指向派生类Circle的对象,所以可以使用dynamic_cast操作符将sp转型为Circle类的指针,而Cylinder是Circle类的子类,当使用dynamic_cast操作符将sp转型为Cylinder类的指针时,就是试图用派生类Cylinder的指针指向其基类Circle的对象,是危险的向下转型,将返回空指针。
typeid操作符和type_info类
操作符typeid可以用来获取对象的类型信息,并可以用来判断对象实际所属的类。使用操作符typeid的语法格式:
typeid(e)
表达式中的e可以是一个类型名,一个对象名,或者由指针、引用变量引用的对象;表达式返回一个type_info类的对象,其中包含小括号中的类或对象所属类的相关信息。
type_info在头文件typeinfo中,命名空间std
type_info类重载了操作符==和!=,用来进行类型比较;
if(typeid(Circle)==typeid(*sp))
type_info类中还定义了一个成员函数name(),用来返回表示类名的字符串。
例如:
typeid(*sp).name() 将返回字符串 “class Circle”
实例:
#include<iostream>
#include<typeinfo>
using namespace std;
class ClassA
{
};
class ClassB :public ClassA
{
public:
void display()
{
cout<< “ClassB”<<endl;
}
};
void main()
{
ClassA * pcla = new ClassB();
if(typeid(ClassB)==typeid(*pcla))
{
ClassB *pclb = dynamic_cast<ClassB>(pcla);
cout<< typeid(*pcla).name()<< pclb->display()<<endl;
}
}