藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 http://www.lslnet.com 2006年6月6日 10:18


十萬火急,求助,C++的類型轉換問題!!

有一個類A;
語句:A a = (A*) B->;getValue();
B類跟A類沒有任何聯繫!
卻能發B類轉化成A類???
請高手講解一下,多謝

十萬火急,求助,C++的類型轉換問題!!

-->
把類a和類b的代碼貼出來。

十萬火急,求助,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 = &amp;   
   
      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();
}

十萬火急,求助,C++的類型轉換問題!!

(A*)B->;getValue() ;
和((A*)B)->;getValue() ;一樣嗎?
還是等同於
(A*)(B->;getValue());

哪個優先級高?

十萬火急,求助,C++的類型轉換問題!!

這樣就可以
比如 A是一個三維的點,B是二維點

A *a=(A*)B->;getValue();
其中B的getvalue寫法就可以是
B::getvalue()
{
        A *a;
        a=new  A(x,y,0);
        return a;
}

十萬火急,求助,C++的類型轉換問題!!

-->
把類a和類b的代碼貼出來。

十萬火急,求助,C++的類型轉換問題!!

-->
把類a和類b的代碼貼出來。

十萬火急,求助,C++的類型轉換問題!!

為什麼可以轉換的理由:它們都指針

十萬火急,求助,C++的類型轉換問題!!

之所以叫強制轉換,就是怎麼轉換都可以,當然必須都是標量類型。



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com