使用这种智能指针铸造是否安全?

时间:2011-12-05 10:27:11

标签: c++ casting smart-pointers tr1

使用这种智能指针铸造是否安全?

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

3 个答案:

答案 0 :(得分:5)

要向下转换智能指针,您应该使用xxxx_pointer_cast函数,例如:一个static cast

BPtr b = std::tr1::static_pointer_cast<B>(a);

dynamic cast

BPtr b = std::tr1::dynamic_pointer_cast<B>(a);

答案 1 :(得分:1)

是否安全是另一个问题。绝对是不寻常的,并且在强行尝试制作它的哑指针时,不能将智能分配给其他类型的引用。

我认为你需要首先找出这些类型。然后。那么,如果你坚持要求它,那么你未来问题的答案很可能是&#34; no&#34;。

答案 2 :(得分:1)

编辑:修改此答案(因为它再次被挖掘并且很长时间过去了)。

AB可能具有继承关系,但shared_ptr<A>shared_ptr<B>没有。 shared_ptr是模板类,具有A的模板实例与与B的实例化无关。

使用类似C的转换(或reinterpret_cast)可以正常工作,但这只是因为您正在强制重新解释基础位。两个不同的dynamic_cast实例上的shared_ptr将失败,因为您没有转换继承的指针但是尝试转换完全不同且不兼容类型的智能指针。

对于你提出的问题,答案是(仍)没有。