Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18691015
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: C/C++

2008-05-30 20:42:11

在使用c++编程时,经常要用到不同数据类型之间的类型转换,可能大家对c语言的类型强制转换比较熟悉,就是在表达时前面加一个“(强制转换类型)”。在c++中仍然可以用c方式的对不同类之间数据类型转换,但是,c++提供了更好的数据类型转换方式,就是利用关键字“dynamic_cast”来完成对不同类之间数据类型之间的转换。

dynamic_cast的使用格式是:

dynamic_cast (ptr)

其中,t必须是一个类的的指针或引用,也可以是 void *,参数ptr必须是一个能得到一个指针或者引用的表达式。

如果t是 void * ,那么 ptr 必须是一个指针,而不能是一个引用。

如果转换成功,dynamic_cast (ptr) 将把ptr转换成你想要转换的类型,如果不成功,返回0(null),如果转换到一个引用类型失败,将会触发一个“bad_cast exception”异常。

下面的代码是dynamic_cast的实例代码:

  
// how to make dynamic casts   
   
// 这个程序必须用 -rt 选项编译  
#include    
#include    
   
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(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(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      if(p=dynamic_cast(components[i]))
         p->open();
}
//--------------------------------------------------------------------------- 
阅读(450) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~