程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++的數據類型轉換關鍵字dynamic_cast

C++的數據類型轉換關鍵字dynamic_cast

編輯:C++入門知識

  在使用C++編程時,經常要用到不同數據類型之間的類型轉換,可能大家對C語言的類型強制轉換比較熟悉,就是在表達時前面加一個“(強制轉換類型)”。在C++中仍然可以用C方式的對不同類之間數據類型轉換,但是,C++提供了更好的數據類型轉換方式,就是利用關鍵字“dynamic_cast”來完成對不同類之間數據類型之間的轉換。

  dynamic_cast的使用格式是:

  dynamic_cast <T> (ptr)

  其中,T必須是一個類的的指針或引用,也可以是 void *,參數ptr必須是一個能得到一個指針或者引用的表達式。

  如果T是 void * ,那麼 ptr 必須是一個指針,而不能是一個引用。

  如果轉換成功,dynamic_cast <T> (ptr) 將把ptr轉換成你想要轉換的類型,如果不成功,返回0(NULL),如果轉換到一個引用類型失敗,將會觸發一個“Bad_cast exception”異常。

  下面的代碼是dynamic_cast的實例代碼:

  

// HOW TO MAKE DYNAMIC CASTS  
   
// 這個程序必須用 -RT 選項編譯 
#include <iostreamstd::>  
#include <typeinfo.h>  
   
class Base1  
{  
   virtual void f(void) { }  
};  
   
class Base2 { };  
class Derived : public Base1, public Base2 { };  
   
int main(void) {  
   try {  
    Derived d, *pd;  
    Base1 *b1 = &d;  
   
    if ((pd = dynamic_cast<Derived *>(b1)) != 0) {  
       std::cout << "The resulting pointer is of type "  
         << typeid(pd).name() << std::endl;  
      }  
    else throw Bad_cast();  
   
    Base2 *b2;  
    if ((b2 = dynamic_cast<Base2 *>(b1)) != 0) {  
      cout << "The resulting pointer is of type "  
   
         << typeid(b2).name() << endl;  
      }  
    else throw Bad_cast();  
    }  
   catch (Bad_cast) {  
    cout << "dynamic_cast failed" << endl;  
    return 1;  
    }  
   catch (...) {  
    cout << "Exception handling error." << endl;  
    return 1;  
    }  
   
   return 0;  
   
}
  

  下面是一個實際應用的例子,在創建數據模塊時,打開數據模塊上面所有的數據集。其原理是:遍歷數據模塊的所有VCL控件,如果可以動態轉換成數據集類型(TDataSet),則調用TDataSet的Open()方法打開它。

  

//---------------------------------------------------------------------------
void __fastcall TDM::DataModuleCreate(TObject *Sender)
{
   int i;
   TDataSet *p;
   for(i=0;i<ComponentCount;i++)
    if(p=dynamic_cast<TDataSet *>(Components[i]))
      p->Open();
}
//---------------------------------------------------------------------------

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved