Это, очевидно, зависит от реализации, но в большинстве реализаций представление в памяти объекта класса A
или B
начинается с указателя на vtable.Вы можете посмотреть на этот указатель vtable, сравнить его с указателями vtable для объектов, которые, как вы знаете, относятся к классу A
или B
, и таким образом определить класс объекта.
Для иллюстрации (конечно, это совсем не хороший стиль):
A *pFoo=new B(); // pointer to object of unknown class (either A or B)
A a; // Object known to be of class A
B b; // Object known to be of class B
void *vptrA=*((void **)&a); // Pointer to vtable of class A
void *vptrB=*((void **)&b); // Pointer to vtable of class B
void *vptrFoo=*((void **)pFoo); // Pointer to vtable of unknown object
if(vptrFoo==vptrA)
printf("Class A\n");
else
printf("Class B\n");
Важно: Это только иллюстрация того, как работает большинство реализаций;Помимо зависимости от реализации, этот метод ломается при наличии множественного наследования.Вы должны никогда делать что-то подобное в рабочем коде;используйте вместо этого RTTI.