C++地数据类型转换关键字dynamic_cast
在使用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(); 
  }
 
沒有留言:
張貼留言