cpp在类型转换之前利用编译器做检查是一个好的习惯,鉴于dynamic_cast的效率问题,建议使用static_cast做转换,向上转换一般是安全的(向上转换指的是子类转换为父类)
有两个转换函数
template<typename To,typename From>
inline To implicit_cast(From const &f)
{
return f;
}
template<typename To,typename From>
inline To Down_cast(From* f)
{
if(false)
{
implicit_cast<From*,To>(0); //编译期检查
}
#if !define(NDEBUG)
assert(f==NULL || dynamic_cast<To>(f) != NULL); //在debug模式下保证能够转换
#endif
return static_cast<To>(f);
}
对于子类和父类之间的转换
如果是向上转换 class Foo{};
class subFoo :Foo{};
可以使用 static_cast<subFoo*>(implicit_cast<Foo*>(Foo*))
如果是向下转换,比如从Foo* 转换到subFoo,则有一定的危险,可以调用
Down_cast