可以使用type_info指针来区分C ++中的类型吗?

时间:2011-08-11 10:38:11

标签: c++ visual-c++ rtti typeid typeinfo

我有一组多态C ++类,它们都是由同一个模块(Windows DLL)实例化的。现在有两个指向这些类的指针,并调用了typeid

SomeCommonBase* first = ...; //valid pointer
SomeCommonBase* second = ...; //valid pointer
const type_info& firstInfo = typeid( first );
const type_info& secondInfo = typeid( second );

我可以比较检索到的type_info地址

if( &firstInfo == &secondInfo ) {
   //objects are of the same class
} else {
   //objects are of different classes
}

或使用==

if( firstInfo == secondInfo ) {
   //objects are of the same class
} else {
   //objects are of different classes
}

检测对象是(完全)相同的类还是不同的类?当在同一个模块中实例化对象时,它是否可以保证工作?

2 个答案:

答案 0 :(得分:2)

您只能检索const type_info引用,并且应始终使用operator==

答案 1 :(得分:2)

正如我写的那样,你的代码是

SomeCommonBase* first = ...; //valid pointer
SomeCommonBase* second = ...; //valid pointer
type_info& firstInfo = typeid( first );
type_info& secondInfo = typeid( second );

它不应该编译,因为typeid会返回对const的引用。

更糟糕的是,您要求提供有关指针的类型信息。两个指针都是SomeCommonBase*类型,所以你可以保证它们属于同一类型。请询问有关指向对象的类型信息。

也就是说,正如@DeadMg所说,你还需要使用operator==来比较类型信息对象。

C ++标准没有解决动态库的问题。但在任何给定的Windows模块中,您应该是安全的。

干杯&第h。,