2011-01-10 100 views
10

假设我有一个充满继承性的C++库。当我知道它实际上指向一个Derived对象并且Derived继承Base时,我得到了一个函数Base*。但我不知道它是什么样的继承(public/protected/private)。我也不知道层次结构中是否有虚拟功能。static_cast vs dynamic_cast

鉴于这种情况,没有寻找到的源代码/文档BaseDerived,其中投我应该使用?或者我应该首先查阅代码/文档以确保多态性?

背景

我写的QMainWindowchangeEvent功能的Qt 4.7。 changeEvent函数需要QEvent*,我可以通过知道QEvent::type()来投射到其他类型。我想知道是否应该使用static_castdynamic_cast

谢谢。

+3

如果您使用的任何库使用受保护的继承,现在是时候找到一个更好的书面库。 – 2011-01-10 15:00:39

+0

这个问题可能会有所帮助:http://stackoverflow.com/questions/28002/regular-cast-vs-static-cast-vs-dynamic-cast – 2011-01-10 15:01:07

+2

@Zac:希望我可以downvote评论。如果你不知道这个图书馆是做什么的,你如何判断受保护的继承是否是这个工作的正确工具? – Puppy 2011-01-10 15:03:59

回答

17

使用static_cast。如果您知道您的Base*指向Derived,则使用static_castdynamic_cast对于何时可能指向派生。

3

从MSDN -

一般来说,你使用的static_cast时要转换数字数据类型,如枚举到整数或整数,以花车,和你有一定的参与转换的数据类型。 static_cast转换不如dynamic_cast转换安全,因为static_cast不执行运行时类型检查,而dynamic_cast执行转换。对模糊指针的dynamic_cast将失败,而static_cast将返回,就像没有错误;这可能是危险的。虽然dynamic_cast转换更安全,但dynamic_cast仅适用于指针或引用,而运行时类型检查是开销。

欲了解更多信息,请查看此link

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); 
} 

或者等价的东西。

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