假设我有一个充满继承的C ++库。当我知道它实际上指向Base*
对象并且Derived
继承Derived
时,我在函数中给了Base
。但我不知道它是什么类型的继承(public / protected / private)。我也不知道层次结构中是否有任何虚函数。
鉴于这种情况,没有查看Base
和Derived
的源代码/文档,我应该使用哪种广告?或者我应该首先查阅代码/文档以确保多态性?
背景
我在Qt 4.7中写changeEvent
QMainWindow
函数。 changeEvent
函数需要QEvent*
,我可以通过了解QEvent::type()
将其转换为其他类型。我想知道我是否应该使用static_cast
或dynamic_cast
。
感谢。
答案 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