假设我有一个类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);
似乎是的,但是我想要一些知道更好的人的确认(我之前从未使用别名构造函数)。
答案 0 :(得分:2)
以下代码是否适合实现我的目标?
是。在这两种情况下(您的替代方案和dynamic_pointer_cast
),您都会shared_ptr
operator->
,B
将返回对A
的引用。在这两种情况下,当所有引用都被销毁时,对象delete
将会virtual
调用它。在所有方面,他们的行为都是一样的。
这也意味着如果你不在A
中定义A
析构函数,那么在这两种情况下,你的代码都会在删除{{1 }}
话虽如此,在这种情况下使用dynamic_pointer_cast
并没有“过分”。