显式类型标识符与RTTI

Coo*_*kie 5 c++ inheritance rtti

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

例如

class A { virtual int mytype() = 0; };
class B : public A { int mytype() {return 1;} };
class C : public A { int mytype() {return 2;} };
Run Code Online (Sandbox Code Playgroud)

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

ere*_*eOn 6

测试之前,不要认为RTTI将比解决方案具有更多/更少的开销.

您应该尝试两种解决方案并测量性能以获得可靠的答案.

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

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

作为一个脚注:如果你的课程是多态的,那么你已经为此付了钱",所以就这样吧dynamic_cast<>."


iam*_*ind 5

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

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

您需要了解这些情况.另一方面,

  1. RTTI仅适用于多态类型(因此不包含虚函数的继承链不能利用RTTI)
  2. 如果对您来说真的很重要,那么由于RTTI会有一点性能下降

但是,正如您在评论中提到的那样,对于较小的继承链,跟踪您自己的输入并没有什么坏处.例如

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

struct D1 : Base {
  D1 () : Base(_D1) {}
};
Run Code Online (Sandbox Code Playgroud)