1、static_cast
用法:static_cast<type_id> (expression)
该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:
(1)用于类层次结构中基类和派生类之间指针或引用的转换
进行上行转换(把派生类的指针或引用转换成基类表示)是安全的
进行下行转换(把基类的指针或引用转换为派生类表示),由于没有动态类型检查,所以是不安全的
(2)用于基本数据类型之间的转换,如把int转换成char。这种转换的安全也要开发人员来保证
(3)把空指针转换成目标类型的空指针
(4)把任何类型的表达式转换为void类型
使用:
class CBase {
virtualvoid foo(){};
};
class CDerived : public CBase
{
public:
char*m_szName[100];
};
class CFerived : public CBase
{
};
//static_cast转换
CBase*pB = NULL;
CDerived*pD = NULL;
pB= static_cast<CBase *>(pD);//向上转换 安全
pD= static_cast<CDerived *>(pB);//向下转换 不安全
CBaseB;
CDerivedD;
B= static_cast<CBase>(D);//派生类对象转换成基类对象
//D= static_cast<CDerived>(B);//基类对象不能转换成派生类对象
inttsdfe = 1;
//chars = "de";
//s= static_cast<char>(tsdfe);//用于基本数据类型之间的转换,如把int转换成char。这种转换的安全也要开发人员来保证
void*pTemp = NULL;
CDerived* pTag = NULL;
pTag= static_cast<CDerived *>(pTemp);//把空指针转换成目标类型的空指针
2、dynamic_cast
用法:dynamic_cast<type_id>(expression)
该运算符把expression转换成type_id类型的对象。type_id必须是类的指针、引用或者void*;
如果type_id是类指针类型,那么expression也必须是一个指针,如果type_id是一个引用,那么expression也必须是一个引用。
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
//dynamic_cast动态转换
//这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(
// 关于虚函数表的概念,详细可见<Insidec++ object model>)中,只有定义了虚函数的类才有虚函数表,
// 没有定义虚函数的类是没有虚函数表的。
CBase*PB1 = new CBase();//指向CBase对象的CBase指针,
CBase*PB2 = new CDerived();//指向CDerived对象的CBase指针,
//CDerived*pd1 = static_cast<CDerived *>(PB1);
CDerived*pd1 = dynamic_cast<CDerived *>(PB2);//安全
CDerived*pd12 = static_cast<CDerived *>(PB2);//安全
CDerived*p1d1 = dynamic_cast<CDerived *>(PB1);//一个空指针
CDerived*p1d2 = static_cast<CDerived *>(PB1);//一个指向该对象的指针,对它进行CDerived中有的CBase中没有类型的操作将是不安全的
//dynamic_cast还支持交叉转换结果是空指针。
//例如:
//CBase*B1 = new CBase();
CDerived*D1 = new CDerived();
CFerived*F1 = NULL; //= new CFerived();
F1= dynamic_cast<CFerived *>(D1);//F1是空指针
//F1= static_cast<CFerived *>(D1);//程序报错