C++的数据类型转换关键字dynamic_cast

2016-02-19 17:17 7 1 收藏

今天给大家分享的是由图老师小编精心为您推荐的C++的数据类型转换关键字dynamic_cast,喜欢的朋友可以分享一下,也算是给小编一份支持,大家都不容易啊!

【 tulaoshi.com - 编程语言 】

  在使用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_castDerived *(b1)) != 0) {  
      std::cout "The resulting pointer is of type "  
         typeid(pd).name() std::endl;  
     }  
   else throw Bad_cast();  
  
   Base2 *b2;  
   if ((b2 = dynamic_castBase2 *(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()方法打开它。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  

//---------------------------------------------------------------------------
void __fastcall TDM::DataModuleCreate(TObject *Sender)
{
  int i;
  TDataSet *p;
  for(i=0;iComponentCount;i++)
   if(p=dynamic_castTDataSet *(Components[i]))
     p-Open();
}
//---------------------------------------------------------------------------

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

来源:http://www.tulaoshi.com/n/20160219/1614863.html

延伸阅读
C#中可使用using关键字自动清除对象资源。 # MyObject.cs using System; namespace MyProjects { public class MyObject : IDisposable { public MyObject() { } public void Dispose ( ) { // Dispose Console.WriteLine ( "Disposed" ) ; // ... } } } # Class1.cs using System; namespace MyProjects { public c...
C# 中的 关键字 之:base、this。base 关键字用于从派生类中访问基类的成员:调用基类上已被其他方法重写的方法。 指定创建派生类实例时应调用的基类构造函数。 基类访问只能在构造函数、实例方法或实例属性访问器中进行。 示例: 在派生类中调用基类方法。 以下是引用片段: // base 关键字 ...
C99中新增加了restrict修饰的指针: 由restrict修饰的指针是最初唯一对指针所指向的对象进行存取的方法, 仅当第二个指针基于第一个时,才能对对象进行存取。 对对象的存取都限定于基于由restrict修饰的指针表达式中。 由restrict修饰的指针主要用于函数形参,或指向由malloc()分配的内存空间。 restrict数据类型不改变程序的语义。 编译器...
在VB中,提供了很多数据类型转换的函数,特别是各种进制数据的转换以及字符串和数字的转换函数,本文将对这些函数做一个简单的小结. 1. 各种进制转换函数 一般的数据进制包括十进制,二进制,十六进制.十进制就是我们日常生活用到的数据进制,因此也是我们最熟悉和清楚的;二进制是计算机的基础进制,主要是因为便于用物理器件实现二进制...
标签: ASP
  巧用in关键字实现数据的批量删除 在WEB编程中经常会碰到数据的批量删除。我们通常的做法是通过循环来实现数据的批量的删除。但是一个程序模块循环用的太多那么这个程序模块的质量就会下降。因此本文就介绍通过巧用in关键字来实现数据的批量删除。 让我们通过一个例子来讲解IN关键字的数据批量删除 假如我们要删除这个页面的数据:相关...

经验教程

622

收藏

84
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部