从基类的共享指针向下转换到派生类的引用

时间:2019-11-20 10:17:24

标签: c++ c++11 shared-ptr

我正在学习使用共享指针。

让我们说我们有两个类,BaseDerived(从Base继承),多态性(除析构函数外,没有虚拟方法)和循环:

for (std::shared_ptr<Base>& pB : collection)
{
  <downcast>
  ...
}

就代码质量,良好做法,性能或任何其他原因而言,以下哪一项是最佳的<downcast>

(1) Derived& d = static_cast<Derived&>(*pB);
(2) Derived& d = *(std::static_pointer_cast<Derived>(pB).get());

1 个答案:

答案 0 :(得分:0)

由于您的类不是多态的,因此您处于困境中,因为您无法在运行时检查向下转换是否有效。如果不是这样,您可能会遇到未定义的行为。静态强制转换(如果可行),但前提是您(在所有迭代中)(超过100%)确保pB指向类型为Derived的对象。

最好的做法/最安全的解决方案是将虚拟析构函数添加到Base并使用动态转换:

Derived& d = dynamic_cast<Derived&>(*pB);

如果强制转换无效,将抛出异常。当然,由于要进行向下转换有效性的运行时检查,因此该解决方案的效率会降低。