在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?
答案 0 :(得分:6)
在测试之前,不要认为RTTI会比解决方案带来更多/更少的开销。
你应该尝试两种解决方案并测量表现以获得可靠的答案。
几年前我实际上问过自己同样的问题,最后我添加了一个成员变量来“紧固”类型测试,就像你一样。原来我的代码不必要地用愚蠢的测试混乱,而一些dynamic_cast<>
会做同样的工作(事实上,更好的工作)。
我从那时起重构了使用dynamic_cast<>
的代码,我不会再回去了。
作为脚注:如果您的课程是多态的,那么您已经为此付了“费用”,所以请使用dynamic_cast<>
。
答案 1 :(得分:5)
具有自定义类型标识符的缺点(对于多态类型)是:
A->B->D
。
对于A *p = new D;
这样的情况,自定义类型标识不允许B*
与p
匹配(即使它有效)。您需要了解这些情况。 另一方面,
但是,正如您在评论中提到的,对于较小的继承链,跟踪您自己的输入没有任何害处。 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。
所以,如果你需要它来处理没有虚函数的类,你必须自己实现它。