C++程序员应了解的那些事(12) C++强制类型转换 ( dynamic_pointer_cast/智能指针的类型转换 )
<1>智能指针的类型转换
C++ 中提供了四种强制类型转换操作符:static_cast, dynamic_cast, const_cast, reinterpret_cast。
而关于shared_ptr 无法利用这些原始的操作符进行转换,其定义了自己的类型转换操作符:static_pointer_cast, dynamic_pointer_cast, const_pointer_cast 。
其用途跟非智能指针的cast意思相同:static_cast可以用来在不相干的类型间转换,只要两个类型之间兼容,例如char 转 int;dynamic_cast 主要用来向下类型转换(基类至少有一个虚函数才行),提供能力的查询,转换失败返回空;向上类型转换可直接转,无需dynamic cast, 但是即使用了dynamic_cast也行,只不过不需要。
<示例代码>
#include <boost/shared_ptr.hpp>
class CBase: public boost::enable_shared_from_this<CBase>
{
public:
virtual void f(){}//必须有个虚函数才能向上向下转换。
}
typedef boost::shared_ptr<CBase> CBasePtr;
class CChild: public CBase
{}
typedef boost::shared_ptr<CChild> CChildPtr;
void main()
{
CBasePtr ptrBase = boost::make_shared<CBase>();
//等同于
//CBasePtr ptrBase = CBasePtr(new CBase());
// 向下转换
CChildPtr ptrChild = boost::dynamic_pointer_cast<CChild>(ptrBase);
// 向上转换
CBasePtr ptrXXX = ptrChild;
// 普通转换
// 使用 get() 返回裸指针
CChildPtr ptrXX = CChildPtr(dynamic_cast<CChild*>(ptrXXX.get()));
}
向上转型是多态的基础,不需要借助任何特殊的方法(同样适用于boost 智能指针,但向下直接转换不行,需借助于dynamic_pointer_cast,因为智能指针是两个完全不同的类型),只需用将子类的指针或引用赋给基类的指针或引用即可,当然dynamic_cast也支持向上转 型,而其总是肯定成功的。而对于向下转型和横向转型来讲,其实对于dynamic_cast并没有任何区别,它们都属于能力查询。
<2>其他(1)指针类型的dynamic_cast
如果一条dynamic_cast语句的转换目标是指针类型并且转换失败了,会返回一个空指针,则判断条件为0,即为false;如果转换成功,指针为非空,则判断条件为非零,即true。
(2)引用类型的dynamic_cast
引用类型的dynamic_cast和指针类型的dynamic_cast在表示错误发生的方式上略有不同。因为不存在空引用,所以对于引用类型来说无法使用与指针类型完全相同的错误报告策略。当对引用类型转换失败时,程序抛出一个名为std::bad_cast的异常,该异常定义在typeinfo标准库头文件中。
(3)dynamic_pointer_cast
dynamic_pointer_cast与dynamic_cast用法类似,当指针是智能指针时候,向下转换,用dynamic_cast 则编译不能通过,此时需要使用dynamic_pointer_cast。
dynamic_cast 是动态强制类型转换的意思,它将基类的指针或引用安全地转换成派生类的指针或引用;
dynamic_pointer_cast 与dynamic_cast类似,将基类的智能指针转换为派生类的智能指针。
下一篇: struts配置导出表格