我正在学习使用共享指针。
假设我们有两个类,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());
由于您的类不是多态的,因此您如履薄冰,因为您无法在运行时检查下转换是否有效。否则,您可能会出现未定义的行为。静态强制转换(如果可以(,但前提是您(超过(100%确信所有迭代中的pB
指向Derived
类型的对象。
最佳实践/最安全的解决方案可能是在Base
中添加一个虚拟析构函数,并使用动态铸造:
Derived& d = dynamic_cast<Derived&>(*pB);
如果强制转换无效,将引发异常。当然,由于运行时要检查下转换的有效性,这种解决方案的效率会降低。