//1. dynamic_cast 转换的两个类 需要有虚函数
//2. dynamic_cast 如果转换的是两个实例指针,转换失败返回的是NULL空
CWeget *pBase = new CWeget;
CChildWeget *pChild = new CChildWeget;
CWeget *ptrBase = dynamic_cast<CWeget*>(pChild); // success
CChildWeget *ptrChild = dynamic_cast<CChildWeget*>(pBase); // return NULL
//3. 如果是引用转换失败会 报出异常,vc9 异常截图如下
CWeget Base;
CChildWeget Child;
CWeget& reBase = dynamic_cast<CWeget&>(Child); // success
CChildWeget& reChild = dynamic_cast<CChildWeget&>(Base); // exception
dynamic_cast 引用方式下转换失败抛出的异常截图(win7,vs2008):
2.杂谈
如果你使用的编译器缺乏对新的类型转换方式的支持,你可以用传统的类型转换方法代替static_cast, const_cast, 以及reinterpret_cast。也可以用下面的宏替换来模拟新的类型转换语法:
#define static_cast(TYPE,EXPR) ((TYPE)(EXPR))
#define const_cast(TYPE,EXPR) ((TYPE)(EXPR))
#define reinterpret_cast(TYPE,EXPR) ((TYPE)(EXPR))
你可以象这样使用使用:
double result = static_cast(double, firstNumber)/secondNumber; bbs.theithome.com
update(const_cast(SpecialWidget*, &sw));
funcPtrArray[0] = reinterpret_cast(FuncPtr, &doSomething);
这些模拟不会象真实的操作符一样安全,但是当你的编译器可以支持新的的类型转换时,它们可以简化你把代码升级的过程。
2.总结
dynamic_cast:把指向基类的指针或引用转换成指向其派生类或其兄弟类的指针或引用,而且你能知道转换是否成功。失败的转换将返回空指针(当对指针进行类型转换时)或者抛出异常(当对引用进行类型转换时)
static_cast:在没有继承关系的类型中进行转换。
const_cast:如果是为了去除const,你总得用。
reinterpret_cast:使用这个操作符的类型转换,其的转换结果几乎都是执行期定义(implementation-defined)。因此,使用reinterpret_casts的代码很难移植。