现在的位置: 首页 > 综合 > 正文

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

2018年02月21日 ⁄ 综合 ⁄ 共 1287字 ⁄ 字号 评论关闭

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;

     }

}

抱歉!评论已关闭.