static_cast vs dynamic_cast

时间:2011-01-10 14:54:40

标签: c++ casting

假设我有一个充满继承的C ++库。当我知道它实际上指向Base*对象并且Derived继承Derived时,我在函数中给了Base。但我不知道它是什么类型的继承(public / protected / private)。我也不知道层次结构中是否有任何虚函数。

鉴于这种情况,没有查看BaseDerived的源代码/文档,我应该使用哪种广告?或者我应该首先查阅代码/文档以确保多态性?

背景

我在Qt 4.7中写changeEvent QMainWindow函数。 changeEvent函数需要QEvent*,我可以通过了解QEvent::type()将其转换为其他类型。我想知道我是否应该使用static_castdynamic_cast

感谢。

3 个答案:

答案 0 :(得分:18)

使用static_cast。如果您知道您的Base*指向Derived,请使用static_cast。当{em>可能指向派生时,dynamic_cast非常有用。

答案 1 :(得分:8)

如有疑问,您应该更喜欢dynamic_cast。它可能会更慢,但你可能不会注意到差异。

如果您需要速度,请使用以下代码段:

template <typename Derived, typename Base>
Derived safe_static_cast(Base b)
{
  assert((void*)dynamic_cast<Derived>(b) && "safe_static_cast failed!");
  return static_cast<Derived>(b);
}

或等同的东西。

这个想法是,在调试版本中,它会检查它确实是你认为它会是什么,它会发布版本......所有内容都已经过测试,不是吗?

答案 2 :(得分:3)

来自MSDN -

  

通常,当您要将数字数据类型(如枚举为int或int)转换为浮点数时,使用static_cast,并且您确定转换中涉及的数据类型。 static_cast转换不像dynamic_cast转换那样安全,因为static_cast没有运行时类型检查,而dynamic_cast则没有。对模糊指针的dynamic_cast将失败,而static_cast返回就好像没有错误;这可能很危险。尽管dynamic_cast转换更安全,但dynamic_cast仅适用于指针或引用,运行时类型检查是一种开销。

有关详细信息,请查看此link