用法
dynamic_cast < type-id > (
expression )
如果type-id是類
指針類型,那麼
expression也必須是一個指針,如果type-id是一個引用,那麼expression也必須是一個引用。
dynamic_cast運算符可以在執行期決定真正的類型。如果downcast是安全的(也就說,如果基類
指針或者引用確實指向一個
派生類對象)這個運算符會傳回適當轉型過的指針。如果downcast不安全,這個運算符會傳回空
指針(也就是說,基類指針或者引用沒有指向一個
派生類對象)。
classB
{
public:
intm_iNum;
virtualvoid foo();
};
classD:public B
{
public:
char*m_szName[100];
};
voidfunc(B *pb)
{
D *pd1 =static_cast<D *>(pb);
D *pd2 =dynamic_cast<D *>(pb);
}
在上面的
代碼段中,如果pb指向一個D類型的對象,pd1和pd2是一樣的,並且對這兩個
指針執行D類型的任何操作都是安全的;
但是,如果pb指向的是一個B類型的對象,那麼pd1將是一個指向該對象的
指針,對它進行D類型的操作將是不安全的(如訪問m_szName),
2注意事項
B中需要檢測有
虛函數的原因:類中存在虛函數,就說明它有想要讓
基類指針或引用指向
派生類對象的情況,此時轉換纔有意義。
這是由於運行時類型檢查需要運行時類型信息,而這個信息存儲在類的
虛函數表(關於
虛函數表的概念,詳細可見<Inside c++ object
model>)中,只有定義了虛函數的類纔有虛函數表,
classA
{
public:
intm_iNum;
virtualvoid f(){}
};
classB:public A
{
};
classD:public A
{
};
voidfoo()
{
B *pb =new B;
pb->m_iNum = 100;
D *pd1 =static_cast<D *>(pb);//compile error
D *pd2 =dynamic_cast<D *>(pb);//pd2 is NULL
deletepb;
}
3運用實例
問題
實例