使用这种智能指针铸造是否安全?
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
答案 0 :(得分:5)
要向下转换智能指针,您应该使用xxxx_pointer_cast函数,例如:一个static cast
BPtr b = std::tr1::static_pointer_cast<B>(a);
BPtr b = std::tr1::dynamic_pointer_cast<B>(a);
答案 1 :(得分:1)
是否安全是另一个问题。绝对是不寻常的,并且在强行尝试制作它的哑指针时,不能将智能分配给其他类型的引用。
我认为你需要首先找出这些类型。然后。那么,如果你坚持要求它,那么你未来问题的答案很可能是&#34; no&#34;。
答案 2 :(得分:1)
编辑:修改此答案(因为它再次被挖掘并且很长时间过去了)。
类A
和B
可能具有继承关系,但shared_ptr<A>
和shared_ptr<B>
没有。 shared_ptr
是模板类,具有A
的模板实例与与B
的实例化无关。
使用类似C的转换(或reinterpret_cast
)可以正常工作,但这只是因为您正在强制重新解释基础位。两个不同的dynamic_cast
实例上的shared_ptr
将失败,因为您没有转换继承的指针但是尝试转换完全不同且不兼容类型的智能指针。
对于你提出的问题,答案是(仍)没有。