Вот небольшой трюк, которым я пользуюсь (надеюсь, он вам тоже подойдет).
Я добавляю следующий закрытый метод к Animal и перезаписываю его в каждом производном классе (я знаю, это немного проблем, но он быстрее, чем RTTI)
class Animal {
protected:
virtual const void* signature() const
{
static bool dummy;
return &dummy;
}
...
}
class Monkey : public Animal {
private:
virtual const void* signature() const
{
static bool dummy;
return &dummy;
}
...
}
Теперь, чтобы увидеть, принадлежат ли два указателя (a и b) к одному классу, просто проверьте
a-> подпись () == b-> подпись ()
Это не совсем решение, это уловка, но оно работает всего с 2 вызовами виртуальных методов (по 1 для каждого из указателей), поэтому оно довольно быстрое.