将 shared_ptr<Base> 向下转换为 shared_ptr<Derived>?

新手上路,请多包涵

更新: 本例中的 shared_ptr 与 Boost 中的类似,但它不支持 shared_polymorphic_downcast(或 dynamic_pointer_cast 或 static_pointer_cast)!

我正在尝试在不丢失引用计数的情况下初始化指向派生类的共享指针:

 struct Base { };
struct Derived : public Base { };
shared_ptr<Base> base(new Base());
shared_ptr<Derived> derived;

// error: invalid conversion from 'Base* const' to 'Derived*'
derived = base;

到目前为止,一切都很好。我没想到 C++ 会隐式地将 Base* 转换为 Derived*。但是,我确实想要代码表达的功能(即,在向下转换基指针的同时保持引用计数)。我的第一个想法是在 Base 中提供一个强制转换运算符,以便可以进行到 Derived 的隐式转换(对于学究:我会检查向下强制转换是否有效,不用担心):

 struct Base {
  operator Derived* ();
}
// ...
Base::operator Derived* () {
  return down_cast<Derived*>(this);
}

好吧,它没有帮助。编译器似乎完全忽略了我的类型转换运算符。有什么想法可以使 shared_ptr 分配工作吗?加分: Base* const 是什么类型? const Base* 我明白,但是 Base* constconst 在这种情况下指的是什么?

原文由 Lajos Nagy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 746
1 个回答

本周我遇到了同样的问题,我的解决方案不涉及仅在现代 c++ (>= 20) 中可用的新类型转换。我只将 reinterpret_cast 与在转换之间创建的共享 ptr 的 const & 一起使用,如下面的代码所示:

 std::shared_ptr<Base> basePtr = createBasePtr();
std::shared_ptr<Derived> derivedPtr = reinterpret_cast<const std::shared_ptr<Derived>&>(basePtr);

原文由 Arthur Motelevicz 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题