如何在虚拟继承的情况下向下转换shared_ptr?

时间:2016-02-25 05:48:58

标签: c++ shared-ptr downcast virtual-inheritance

假设我有一个类C,继承自B,它本身几乎继承自A

class A {};
class B : virtual public A {};
class C : public B {};

现在假设我有一个std::shared_ptr<A>管理一个对象,我知道这个对象是继承B的某个类(例如,类C),我甚至碰巧拥有它可用作原始B指针,其方式与下面的最小示例相同:

B * pb = new C;
std::shared_ptr<A> spa(pb);

现在我想将std::shared_ptr<A>转发为std::shared_ptr<B> 。我无法使用static_pointer_cast,因为继承是虚拟的。我可以使用dynamic_pointer_cast,但考虑到我已经将对象作为原始B指针使用,这似乎有点过分了。

以下代码是否适合实现我的目标?

std::shared_ptr<B> spb(spa, pb);

似乎是的,但是我想要一些知道更好的人的确认(我之前从未使用别名构造函数)。

1 个答案:

答案 0 :(得分:2)

  

以下代码是否适合实现我的目标?

是。在这两种情况下(您的替代方案和dynamic_pointer_cast),您都会shared_ptr operator->B将返回对A的引用。在这两种情况下,当所有引用都被销毁时,对象delete将会virtual调用它。在所有方面,他们的行为都是一样的。

这也意味着如果你A中定义A析构函数,那么在这两种情况下,你的代码都会在删除{{1 }}

话虽如此,在这种情况下使用dynamic_pointer_cast并没有“过分”。