C++的資料類型轉換關鍵字dynamic_cast

來源:互聯網
上載者:User
在使用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();
}
//--------------------------------------------------------------------------- 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.