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



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

假设我们有两个类,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());

由于您的类不是多态的,因此您如履薄冰,因为您无法在运行时检查下转换是否有效。否则,您可能会出现未定义的行为。静态强制转换(如果可以(,但前提是您(超过(100%确信所有迭代中的pB指向Derived类型的对象。

最佳实践/最安全的解决方案可能是在Base中添加一个虚拟析构函数,并使用动态铸造:

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

如果强制转换无效,将引发异常。当然,由于运行时要检查下转换的有效性,这种解决方案的效率会降低。

最新更新