1

我有一组多态 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
}

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

4

2 回答 2

2

在我写这篇文章时,您的代码是

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

它不应该编译,因为typeid返回对const.

更糟糕的是,您正在询问有关指针的类型信息。两个指针都是 type SomeCommonBase*,所以你可以保证它们是相同的类型。而是询问有关指向对象的类型信息。

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

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

干杯&hth.,

于 2011-08-11T10:53:56.880 回答
2

您只能检索consttype_info 引用,并且您应该始终使用operator==.

于 2011-08-11T10:40:08.850 回答