【发布时间】:2010-11-18 07:02:51
【问题描述】:
【问题讨论】:
标签: c++
【问题讨论】:
标签: c++
从基类类型转换为派生类类型时使用dynamic_cast。它检查被强制转换的对象实际上是派生类类型,如果对象不是所需的类型,则返回一个空指针(除非你正在强制转换为引用类型——然后它抛出一个bad_cast 异常)。
如果不需要此额外检查,请使用static_cast。正如 Arkaitz 所说,由于 dynamic_cast 执行额外的检查,它需要 RTTI 信息,因此具有更大的运行时开销,而 static_cast 是在编译时执行的。
【讨论】:
在某些情况下,比如这个,“静态”是指编译时,“动态”是指运行时。
对于编译时检查,请使用 static_cast(仅限于编译器知道的内容)。 对于运行时检查,请使用 dynamic_cast(仅限于具有 RTTI 的类)。 如果不检查,请使用 reinterpret_cast。
【讨论】:
动态转换需要 RTTI 并且与静态转换相比具有一定的魔力。 static_cast 只是一个编译时转换,检查是否可以通过一些简单的规则将源类提升为转换类。
例如,在虚拟继承的情况下,只有 dynamic_cast 可以解决这种情况。
另外,如果无法进行强制转换,dynamic_cast 将返回 NULL,因此您可以做出不同的决定。
另一方面,dynamic_cast 速度较慢,因为它意味着正在执行一些代码,并且如前所述,它需要启用 RTTI,这会增加二进制文件的大小。
【讨论】:
静态转换由编译器完成:无论如何,它都将结果视为目标类型。当您完全确定参数是目标类型时,您可以这样做。
动态转换在运行时完成,因此需要运行时类型信息。当您不确定自己拥有的类型时,您可以这样做:强制转换可能会失败,这表现为返回值为 null。它也只能用于指针和引用。
【讨论】:
dynamic_cast 检查运行时可用的信息,例如 RTTI,它还遍历类层次结构以查看此类转换是否可行。
【讨论】:
static_cast 类似于旧的 C 风格转换,几乎可以应用于任何事物。 static_cast 将在您有问题的某些类型时使用。例如,在int 和enum 之间进行转换时,我通常使用static_cast。
dynamic_cast 只能与指针和引用一起使用。转换失败时,返回一个空指针。 dynamic_cast 通常在解析指向继承中使用的类的指针时使用,您希望确保正在转换的指针是预期的类型。
也可以查看C++ : Documentation : C++ Language Tutorial : Type Casting
【讨论】:
如果你在谈论 C++。那么 static_cast 不是安全的类型转换。它可以转换为您的类型,但如果它错误,它不会抛出任何错误/消息。所以你会从中得到坏的对象。如果转换失败,dynamic_cast 会抛出错误 :) 希望这会有所帮助! :)
【讨论】: