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

标签 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);

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

最佳答案

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/

相关文章:

C++ : Data Structure withe fast searching and less memory requirements

c++ - 指向成员问题的指针

c++ - 对两个 QVector 进行排序

c++ - 处理 std::shared_ptr 应该多谨慎?

java - 检测对象类型然后相应地转换它?

C++:如果数组中任何其他字符之前有一个空字符怎么办?

c++ - 使用原始指针在其 shared_ptr 死亡时发生的情况

c++ - 自动添加和删除列表中的对象

swift - 无法修改函数体内的函数参数

C++——在一个类的不同模板化版本之间进行转换的方法