Есть ли способ сказать, на какой тип указатель на самом деле указывает в Переполнение стека

В 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;
}

2

Решение

Это терпит неудачу, потому что вы не объявили никаких виртуальных функций в Foo, Измените его, например, на виртуальный деструктор, и вы получите ожидаемый результат.

7

Другие решения

То, что вы ищете, — это отражение или RTTI (информация о типе времени выполнения).

См. Это для информации, чтобы начать на предмете: атрибут & Отражение библиотеки для C ++?

Неудивительно, что в Википедии также есть статья о RTTI: http://en.wikipedia.org/wiki/Run-time_type_information

Кроме того, существуют платформы, которые предоставляют функции отражения для объектов, производных от некоторого общего базового класса (который предоставляет методы отражения, унаследованные для всех подклассов). Примером является Мета-объектная система Qt. Они могут предоставить гораздо больше информации, чем простой C ++ RTTI, и обеспечить полную поддержку отражения (например, вызов метода по имени, неизвестному во время компиляции, например код JavaScript, вызывающий метод C ++).

2

По вопросам рекламы [email protected]