当前位置:主页   - 电脑 - 程序设计 - C/C++
C++的数据类型转换关键字dynamic_cast
来源:网络   作者:   更新时间:2012-02-14
收藏此页】    【字号    】    【打印】    【关闭

  在使用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、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明