如何在虚拟继承的情况下向下转换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"。
假设我有一个 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"。