The below code explains the problem. Fill in same_sub_class to detect if the two pointers to virtual base class A are in fact the same concrete class.
struct A {
...
}:
struct B : public A {
...
}:
struct C : public A {
...
}
bool same_sub_class(A * a1, A * a2){
// Fill this in to return true if a1 and a2 are
// of the same concrete class
}
EDIT:
As I look at my application I need something slightly different from the above. I need to be able to group instances by their type_id.
FYI. I have a mini symbolic algerbra system so to do manipulations it is important to know the class type sometimes for sorting, and rearranging expressions.
So given a vector of pointers to instance how to group them by their type_id. I'd either need to be able to hash the type_id or generate a unique integer for every class.
If you can use RTTI,
typeid(*a1) == typeid(*a2)
I think you also need to
#include <typeinfo>
And you must have a virtual function in your classes so that the vtable exists--a destructor should do fine.
UPDATE:
I'm not sure I completely understand what your requirements are for grouping (Do you need some kind of deterministic ordering? What should happen with sub-subclasses?), but you could try using the value returned from the typeid
operator to either:
typeid(*ptr).name()
typeid(*a1).before(typeid(*a2))
as an ordering criterion. This doesn't have any determinism between runs, though. Generally when considering RTTI, it is a good idea to see if any of this can be accomplished better using well-crafted virtual functions (double dispatch, for example). I really can't say if there is a good alternative in your case though, since I don't understand the specifics.