1. 程式人生 > >c\c++複習基礎要點15----c++執行時型別識別 dynamic_cast typeid type_info

c\c++複習基礎要點15----c++執行時型別識別 dynamic_cast typeid type_info

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;

     }

}