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

How to downcast a shared_ptr in the case of virtual inheritance?

假设我有一个 class C,继承自 B,它本身实际上继承自 A:

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

现在假设我有一个 std::shared_ptr<A> 管理一个对象,我确定它是一些 class 继承 B 的对象(例如 class 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);

似乎是的,但我想得到更了解的人的确认(我以前从未使用过别名构造函数)。

Is the following code the appropriate way to achieve my goal?

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

这也意味着,如果您A中定义virtual析构函数,那么在这两种情况下,您的代码都将中断删除 A.

也就是说,在这种情况下使用 dynamic_pointer_cast 没有任何意义 "overkill"。