我想知道 dynamic_cast 和 typeid 之间的区别仅在于类比较(除了 dynamic_cast 允许访问子类的方法和 typeid 仅对类比较有用)。我发现一个两岁的StackOverflow问同样的问题: C++ equivalent of instanceof。然而,它已经两岁了,我不想发现一个旧帖子(而且我不确定 typeid 何时出现),所以我想重新问同样的问题,略有不同。
基本上,我有类A和类B,它们都是抽象类C的子类。类C被作为方法的参数接受,我想确定类C是否真的是类A或类B. typeid 和 dynamic_cast 都能正常运行,因此这更像是最佳做法/效果的问题。我在猜测:
A* test = dynamic_cast<A*> someClassCVar
if (test != 0) { //it is of class A }
OR
if (typeid(someClassCVar) == typeid(A)) {
//it is of class A
}
编辑:抱歉,我忘了提供这些信息。 ActiveMQ CMS文档声明使用 dynamic_cast ,但我认为这只是因为它假定用户希望访问特定于子类的方法。对我来说,如果只需要进行类比较,那么 typeid 似乎会有更好的表现: http://activemq.apache.org/cms/cms-api-overview.html
答案 0 :(得分:31)
这两种方法之间存在重要差异:
if(A* test = dynamic_cast<A*>(&someClassCVar)) {
// someClassCVar is A or publicly derived from A
}
鉴于:
if(typeid(someClassCVar) == typeid(A)) {
// someClassCVar is of class A, not a derived class
}
答案 1 :(得分:1)
这取决于帖子类型识别处理是否需要A上的指针。
cheking typeid肯定会更快(因为它们是编译器生成的常量标识符)但不会提供任何A实例来操作,因此会强制您执行dynamic_cast来获取A实例。