9.7 类类型之间的强制转换
我们在前面看到,派生类对象的地址可以存储在基类类型的变量中-- 比如CContainer*类型的变量就可以存储CBox对象的地址。那么,如果有一个地址存储在CContainer*类型的指针中,可以将其强制转换为CBox*类型吗?当然可以,dynamic_cast运算符就是专门执行此类操作的。下面是该运算符的工作过程:
- CContainer* pContainer = new CGlassBox(2.0, 3.0, 4.0);
- CBox* pBox = dynamic_cast<CBox*>( pContainer);
- CGlassBox* pGlassBox = dynamic_cast<CGlassBox*>( pContainer);
第一条语句将在堆上创建的CGlassBox对象的地址存入一个CContainer*类型的基类指针。第二条语句将类层次结构中底层的pContainer强制转换为CBox*类型。第三条语句将pContainer中的地址强制转换为实际的类型CGlassBox*。
我们不仅可以对指针,也可以对引用应用dynamic_cast运算符。dynamic_cast与static_cast之间的区别在于,dynamic_cast运算符在运行时检查转换的有效性,而static_cast运算符则不然。如果dynamic_cast操作无效,则结果为空。编译器依赖编程(www.cppentry.com)人员来保证static_cast操作的有效性,因此我们应该总是使用dynamic_cast在类层次结构中执行向上和向下的强制转换操作,如果还希望避免程序因使用空指针而意外终止,那么还应该检查转换的结果是否为空。