使用这种智能指针强制转换是否安全?

Is it safe to use such smart pointer casting?

本文关键字:转换 是否 安全 指针 智能      更新时间:2023-10-16

使用这种智能指针强制转换安全吗?

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:修改这个答案(因为它又被挖出来了,已经过去很久了)。

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

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

对于你提出的问题,答案(仍然)是否定的。