用于类比较的C ++ dynamic_cast vs typeid

时间:2012-03-14 15:28:31

标签: c++ casting

  

可能重复:
  C++ equivalent of instanceof

我想知道 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

2 个答案:

答案 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实例。