关于c ++:static_cast vs dynamic_cast


static cast versus dynamic cast

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Regular cast vs. static_cast vs. dynamic_cast

我不太明白何时使用静态强制转换和何时使用动态转换。有什么解释吗?


当从一个基底级到一个源级的铸造时。It checks that the object being cast is actually of the derived class,and returns a null pointer if the object is not of the desired type(unless you're casting to a reference type-then it throws a bad_castexception).

如果不需要这个额外检查的话。根据Arkaitz的说法,自从dynamic_cast以来,它要求RTTI信息和THUS在编译时间上有一个很大的Runtime Overhead,whereas static_cast


In some contexts,like this one,"static"refers to compile-time and"dynamic"refers to run-time.

For compile-time checking,use static ^ ucast(limited to what the compiler knows).For run-time checking,use dynamic cast(limited to classions with RTTI).无检验,使用再加工 xCAst。


动态 cast checks information available at run-time,例如RTTI,it also traves class hierachies to see if such cast is possible.

Cplusplus.com+type casting tectorial


静态铸造是由编译器完成的:它把结果当作目标类型处理,不重要是什么。当你确信目标类型的论据是正确的时候你就这么做

动态铸造是在运行过程中进行的,因此需要运行类型的信息。当你不确定你的类型时,你会这样做:种子可能会失败,因为回报价值是零。这也只能用于指针和参考。


与旧的C型铸件相似,可以应用于任何东西。当你确定这类人时,会使用。例如,我通常使用static_castintenum之间铸造。

只能使用指针和参考。在铸造过程中失败,一个零指针又回来了。一般来说,当分辨指针到分辨指针的班级时,在你想确保指针是你所期望的类型时,它被使用。

也检查输出C+:文档C++语言教学:类型铸造


动态铸造要求RTTI和一些与静态铸造相比较的魔法。静态 ucast is just a compile time cast,checks if origin class can be promoted to the casted class by some simple rules as inheritance.

例如,在虚拟遗产案例中,只有动态 cast能够解决这种情况。

如果种姓不可能,动态 cast将返回零,所以你可以做出不同的决定。

在另一个手上,动态 ucast是缓慢的,因为它执行了一些代码,而且前面已经指出,它需要RTTI生成增加二进制大小的代码。


如果你在谈论C+然后静态铸造不安全。这可能会影响到你的类型,但如果它的错误不会导致错误/消息。所以你会从那得到坏东西如果铸造失败,动态铸造是错误的:)希望这一帮助!注: