【发布时间】:2013-04-22 09:25:37
【问题描述】:
我是学习高级 C++ 主题的新手,所以如果问题听起来太明显,请原谅我。
我一直在阅读有关在C++中我们可以在运行时获取对象类型信息的各种方法,通常称为RTTI。
但是,我对它是如何工作的感到困惑。 我读过一些在解释 RTTI 时经常提到的东西。其中之一是使用 dynamic_cast 将对象动态地转换为其他对象。另一种是在运行时使用 typeid 来确定对象的类型。
我想知道使用 typeid 是否是在 C++ 中实现 RTTI 的正确方法,如果是,那么 typeid 运算符实际上如何能够在运行时确定对象的类型(它是否分析了内存中的对象 blob?)
如果使用 typeid 不是正确的方法,那么请提出一些其他的实现方法。
【问题讨论】:
-
看起来你把它弄反了。
typeid可以工作,因为 RTTI 是在编译器中实现的,所以询问是否使用typeid“实现 RTTI”看起来很困惑。 “实施 RTTI”到底是什么意思? -
你想解决什么问题让你认为你需要 RTTI 和/或 typeid?
-
C++ RTTI 系统是reflection 的一个非常差且没有功能的变体。我个人的看法是,无论使用哪种语言,你都应该尽可能地避免设计中的任何反思需求。
-
我只是想很好地掌握 RTTI 的概念。我在很多地方都读到过 typeid 运算符可用于确定所讨论对象的运行时类型(当然,确定对象类型的问题会出现在图片中继承时)。但是,我不太了解 dynamic_cast 与 RTTI 有什么关系。
-
dynamic_cast和typeid都依赖于名为 RTTI 的语言功能。如果您的源代码使用其中任何一个,则需要 RTTI 才能编译程序。但是,RTTI 需要很小的运行时开销,因此某些编译器允许您将其关闭。这就是为什么我们希望“typeid和dynamic_cast”有一个通用名称,而不是孤立地讨论它们。