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;
}
}