Domanda

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?

È stato utile?

Soluzione

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.,

Altri suggerimenti

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top