在使用C++编程时,经常要用到不同数据类型之间的类型转换,可能大家对C语言的类型强制转换比较熟悉,就是在表达时前面加一个(强制转换类型)。在C++中仍然可以用C方式的对不同类之间数据类型转换,但是,C++提供了更好的数据类型转换方式,就是利用关键字dynamic_cast来完成对不同类之间数据类型之间的转换。
dynamic_cast的使用格式是:
dynamic_cast T (ptr)
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)其中,T必须是一个类的的指针或引用,也可以是 void *,参数ptr必须是一个能得到一个指针或者引用的表达式。
如果T是 void * ,那么 ptr 必须是一个指针,而不能是一个引用。
如果转换成功,dynamic_cast T (ptr) 将把ptr转换成你想要转换的类型,如果不成功,返回0(NULL),如果转换到一个引用类型失败,将会触发一个Bad_cast exception异常。
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)下面的代码是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()方法打开它。
//---------------------------------------------------------------------------
void __fastcall TDM::DataModuleCreate(TObject *Sender)
{
int i;
TDataSet *p;
for(i=0;iComponentCount;i++)
if(p=dynamic_castTDataSet *(Components[i]))
p-Open();
}
//---------------------------------------------------------------------------