使用这种智能指针强制转换安全吗?
APtr a(new A());
BPtr & b = (Bptr&)a; // this is it
,
class A
{
public:
virtual ~A(){}
virtual void methodA() = 0;
}
typedef std::tr1::shared_ptr<A> APtr;
class B : public A
{
public:
virtual ~B(){}
virtual void methodB() = 0;
}
typedef std::tr1::shared_ptr<B> BPtr;
/////////////////////////////////////////////////////////////////////////////////
BPtr & b = a; //this way doesn't work
要向下转换智能指针,应该使用xxxx_pointer_cast函数,例如静态强制转换
BPtr b = std::tr1::static_pointer_cast<B>(a);
或动态强制转换
BPtr b = std::tr1::dynamic_pointer_cast<B>(a);
是否安全是另一个问题。这绝对是不寻常的,也不太可能给其他类型的引用分配一个智能指针,同时也强行尝试使它成为一个哑指针。
我认为你需要先弄清楚这些类型是什么。然后。好吧,如果你以后还坚持要问的话,答案很可能是"不"。
EDIT:修改这个答案(因为它又被挖出来了,已经过去很久了)。
类A
和B
可能有继承关系,但shared_ptr<A>
和shared_ptr<B>
没有。shared_ptr
是一个模板类,A
的模板实例化与B
的实例化没有关系。
使用类似c的类型转换(或reinterpret_cast
)工作,但只是因为你正在强制重新解释底层位。两个不同shared_ptr
实例上的dynamic_cast
将失败,因为您没有强制转换继承的指针,而是试图强制转换完全不同且不兼容类型的智能指针。
对于你提出的问题,答案(仍然)是否定的。