Question

I have a set of polymorphic C++ classes and they are all instantiated by the same module (Windows DLL). Now having two pointers to such classes and having called typeid:

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

can I compare retrieved type_info addresses

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

or use ==

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

to detect whether objects are of (exactly) the same class or of different classes? Is it guaranteed to work when objects are instantiated from within the same module?

Was it helpful?

Solution

As I'm writing this, your code is

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

It should not compile because typeid returns a reference to const.

Worse, you are asking for type info about the pointers. Both pointers are of type SomeCommonBase*, so you're guaranteed that they are of the same type. Ask instead for type info about the pointed to objects.

That said, as @DeadMg remarked, you also need to use operator== to compare type info objects.

The C++ standard does not address the issue of dynamic libraries. But within any given Windows module you should be safe.

Cheers & hth.,

OTHER TIPS

You can only retrieve const type_info references, and you should always use operator==.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top