В C ++ вы можете объявить указатель как один тип, а затем направить его на другой, наследуемый тип. Есть ли способ узнать, на что вы сейчас указываете?
#include <typeinfo>
using namespace std;
class Foo
{
};
class Bar : public Foo
{
};
int main()
{
Bar bar;
Foo* foo = &bar;
bool I_WANT_THIS_TO_BE_TRUE = (typeid(*foo) == typeid(Bar));
return 0;
}
Это терпит неудачу, потому что вы не объявили никаких виртуальных функций в Foo
, Измените его, например, на виртуальный деструктор, и вы получите ожидаемый результат.
То, что вы ищете, — это отражение или RTTI (информация о типе времени выполнения).
См. Это для информации, чтобы начать на предмете: атрибут & Отражение библиотеки для C ++?
Неудивительно, что в Википедии также есть статья о RTTI: http://en.wikipedia.org/wiki/Run-time_type_information
Кроме того, существуют платформы, которые предоставляют функции отражения для объектов, производных от некоторого общего базового класса (который предоставляет методы отражения, унаследованные для всех подклассов). Примером является Мета-объектная система Qt. Они могут предоставить гораздо больше информации, чем простой C ++ RTTI, и обеспечить полную поддержку отражения (например, вызов метода по имени, неизвестному во время компиляции, например код JavaScript, вызывающий метод C ++).