您的位置:首页 > 编程语言 > C语言/C++

c\c++复习基础要点15----c++运行时类型识别 dynamic_cast typeid type_info

2013-10-07 01:06 507 查看
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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐