开门见山 废话少说
一、与多态类型相关的转换
1、 polymorphic_cast与dynamic_cast
dynamic_cast可以安全地将一个指向多态对象的指针向下转换为派生类指针。但是,当dynamic_cast转换失败时,返回的是NULL,也就是说,dynamic_cast的转换成功与否是在运行期确定,而不像其他C++内建cast那样在编译期确定。换言之,如果在进行dynamic_cast之后,不检测返回值,就等于埋下了一个定时炸弹。
而Boost的polymorphic_cast在dynamic_cast的基础上增加了对返回值的检测,如果转换失败,它就会抛出std::bad_cast。
2、 polymorphic_downcast与dynamic_cast
但是抛出异常会降低程序的效率,而且dynamic_cast更会查询一个type_info结构来确定正确的类型,所以不管是空间上的成本还是时间上的成本,都会大大增加。
polymorphic_downcast可以把成本降低到最低,甚至是编译期上。不过使用这个转换必须非常的小心。
//#define NDEBUG
#include<cassert>
using namespace std;
struct A{
virtual ~A(){}
};