显式类型标识符与RTTI

时间:2011-05-25 12:42:22

标签: c++ inheritance rtti

在RTTI上使用自己的类型标识符有什么好处吗?

e.g。

class A { virtual int mytype() = 0; };
class B : public A { int mytype() {return 1;} };
class C : public A { int mytype() {return 2;} };

它会更快吗?开销减少了?或者在这种情况下是否应该总是使用RTTI?

3 个答案:

答案 0 :(得分:6)

测试之前,不要认为RTTI会比解决方案带来更多/更少的开销。

你应该尝试两种解决方案并测量表现以获得可靠的答案。

几年前我实际上问过自己同样的问题,最后我添加了一个成员变量来“紧固”类型测试,就像你一样。原来我的代码不必要地用愚蠢的测试混乱,而一些dynamic_cast<>会做同样的工作(事实上,更好的工作)。

我从那时起重构了使用dynamic_cast<>的代码,我不会再回去了。

作为脚注:如果您的课程是多态的,那么您已经为此付了“费用”,所以请使用dynamic_cast<>

答案 1 :(得分:5)

具有自定义类型标识符的缺点(对于多态类型)是:

  1. 需要记录每一个 继承的类。你需要分配 一个唯一的整数或枚举值 给定层次结构中的所有类
  2. 说你的垂直 继承就像A->B->D。 对于A *p = new D;这样的情况,自定义类型标识不允许B*p匹配(即使它有效)。
  3. 您需要了解这些情况。 另一方面,

    1. RTTI仅适用于 多态类型(所以 继承链不包含 虚函数无法利用RTTI)
    2. 有一点表现 由于RTTI,差异减少,如果它真的 对你很重要
    3. 但是,正如您在评论中提到的,对于较小的继承链,跟踪您自己的输入没有任何害处。 e.g。

      struct Base {
        enum TYPES { _BASE, _D1, _D2, _D3 };
        const TYPES &myType;
        Base (TYPES) : myType(_BASE) {}
      };
      
      struct D1 : Base {
        D1 () : Base(_D1) {}
      };
      

答案 2 :(得分:3)

http://en.wikibooks.org/wiki/C%2B%2B_Programming/RTTI

  

RTTI有一些限制。首先,RTTI只能与多态类型一起使用。这意味着您的类必须至少具有一个虚函数,可以直接或通过继承。其次,由于存储类型所需的附加信息,一些编译器需要一个特殊的开关来启用RTTI。

所以,如果你需要它来处理没有虚函数的类,你必须自己实现它。