0

我对动态转换、typeid() 和模板有一些疑问

1)为什么 typeid 不需要 RTTI ?

2) 多态类型的dynamic_cast:

  • 当我使用 RTTI 进行向下转换(Base to Derive)时 - 编译通过

    当 RTTI 关闭时 - 我收到警告(警告 C4541: 'dynamic_cast' 用于带有 /GR- 的多态类型'CBase';可能会导致不可预测的行为)

  • 当我进行向上转换(派生到基础)时,无论是否使用 RTTI - 编译都会顺利通过

我不明白为什么当我进行向上转换并且 RTTI 关闭时 - 我没有收到任何警告/错误!

3) 非多态类型的 dynamic_cast:

  • 当我使用或不使用 RTTI 进行向下转换时 - 编译失败(错误 C2683:'dynamic_cast':'CBase' 不是多态类型)

  • 当我在有或没有 RTTI 的情况下进行向上转换时 - 编译顺利通过。

如何在没有 RTTI 的非多态类型通行证上向上转换?

4) 模板函数前面的'inline' 是否有任何影响,即当编译器编译该函数并看到它是'inline' 时,它实际上会将函数视为inline 还是被忽略?

非常感谢大卫的帮助

4

1 回答 1

2

1) 它确实需要 RTTI。至少如果你在多态类上使用它......这确实是它的目的。

2) 如果您在 dynamic_cast 上没有 RTTI,则无法检查您要转换的对象是否实际上是您要转换的对象类型。这是 dynamic_cast(本质上)和 static_cast 之间的区别。Static_cast 不检查这一点,因此不太“安全”但速度更快。因此,如果您没有 RTTI,则在向下转换时它无法进行动态转换

向上转型是安全的,因为您可以在编译时确定类型,因此您可以使用 dynamic_cast 向上转型到基类。

3) dynamic_cast 向下转换适用于多态类型(例如,其中带有虚函数的类型),因此如果类不是多态的,它就不会工作。因此,如果 CBase 没有虚函数,则不能将 dynamic_cast 与它一起使用。

向上转换的原因与 2 相同。

我认为您应该阅读一下不同演员表的用途。

http://www.cplusplus.com/doc/tutorial/typecasting/

4)是的,它会将其编译为内联。

于 2010-05-19T18:47:11.817 回答