假设我有一个类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);
似乎是的,但我希望得到更了解的人的确认(我以前从未使用过别名构造函数)。
最佳答案
Is the following code the appropriate way to achieve my goal?
是的。在这两种情况下(您的替代方案和dynamic_pointer_cast
),您都会得到一个shared_ptr
,它的operator->
将返回对B<的引用
。在这两种情况下,当所有引用都被销毁时,对象A
将调用delete
。在所有方面,他们的行为都是一样的。
这也意味着,如果您没有在A
中定义虚拟
析构函数,那么在这两种情况下,您的代码都会中断删除A
。
话虽这么说,在这种情况下使用 dynamic_pointer_cast
并没有什么“过分”的地方。
关于c++ - 在虚拟继承的情况下如何向下转换shared_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35619366/