我正在学习使用共享指针。
让我们说我们有两个类,Base
和Derived
(从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());
答案 0 :(得分:0)
由于您的类不是多态的,因此您处于困境中,因为您无法在运行时检查向下转换是否有效。如果不是这样,您可能会遇到未定义的行为。静态强制转换(如果可行),但前提是您(在所有迭代中)(超过100%)确保pB
指向类型为Derived
的对象。
最好的做法/最安全的解决方案是将虚拟析构函数添加到Base
并使用动态转换:
Derived& d = dynamic_cast<Derived&>(*pB);
如果强制转换无效,将抛出异常。当然,由于要进行向下转换有效性的运行时检查,因此该解决方案的效率会降低。