Можно ли как-то в c++ узнать принадлежность объекта классу?
У меня есть (пока нет но, прежде чем начать нужно определится с такими вещами) массив объектов игры. Это разные классы, которые наследуют от одного (Object, например). То есть все они являются Object.
Но как мне понимать, что элемент этого массива является не только Object в общем, но и, например, игроком или врагом или стеной или еще чем-то?
В js я бы написал:
if (objects[i] instanceof Wall)
Но как такое сделать с С++? При этом без костылей.
Или может быть я не правильно понимаю как такие вещи делаются в С++? Если да, но как это организовывают?
Finding the type of an object in C++
I have a class A and another class that inherits from it, B. I am overriding a function that accepts an object of type A as a parameter, so I have to accept an A. However, I later call functions that only B has, so I want to return false and not proceed if the object passed is not of type B.
What is the best way to find out which type the object passed to my function is?
11 Answers 11
dynamic_cast should do the trick
The dynamic_cast keyword casts a datum from one pointer or reference type to another, performing a runtime check to ensure the validity of the cast.
If you attempt to cast to pointer to a type that is not a type of actual object, the result of the cast will be NULL. If you attempt to cast to reference to a type that is not a type of actual object, the cast will throw a bad_cast exception.
Make sure there is at least one virtual function in Base class to make dynamic_cast work.
RTTI is available only for classes that are polymorphic, which means they have at least one virtual method. In practice, this is not a limitation because base classes must have a virtual destructor to allow objects of derived classes to perform proper cleanup if they are deleted from a base pointer.
Как узнать класс объекта с

Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке — https://slurm.club/3MeqNEk
Reflection в Java — Примеры использования

Начнем с основ. Входная точка в механизм рефлексии Java — класс Class . Да, выглядит действительно забавно, но на то она и рефлексия 🙂 С помощью класса Class мы, прежде всего, определяем класс любого объекта, переданного в наш метод. Давай попробуем это сделать: Вывод в консоль: Обрати внимание на две вещи. Во-первых, мы специально положили класс Cat в отдельный пакет learn.javarush; теперь ты видишь, что getClass() возвращает полное имя класса. Во-вторых, мы назвали нашу переменную clazz . Выглядит немного странно. Ее, конечно, стоило бы назвать «class», но «class» — зарезервированное слово в языке Java, и компилятор не позволит так называть переменные. Пришлось выкручиваться 🙂 Что ж, для начала неплохо! Что у нас там было еще в списке возможностей?
Как получить информацию о модификаторах класса, полях, методах, константах, конструкторах и суперклассах
Как создать экземпляр класса, если имя класса неизвестно до выполнения программы

Начнем с конструктора по умолчанию. Его пока нет в нашем классе Cat , поэтому давай добавим его: Вот как будет выглядеть код для создания объекта Cat с помощью рефлексии (метод createCat() ): Вводим в консоль: Вывод в консоль: Это не ошибка: значения name и age отображаются в консоли из-за того, что мы запрограммировали их вывод в методе toString() класса Cat . Здесь мы считываем имя класса, объект которого будем создавать, с консоли. Запущенная программа узнает имя класса, объект которого ей предстоит создать. Для краткости мы опустили код правильной обработки исключений, чтобы он не занял больше места, чем сам пример. В реальной программе, конечно, обязательно стоит обработать ситуации ввода некорректных имен и т.д. Конструктор по умолчанию — штука довольно простая, поэтому и создать экземпляр класса с его помощью, как видишь, несложно 🙂 А с помощью метода newInstance() мы создаем новый объект этого класса. Другое дело, если конструктор класса Cat будет принимать на вход параметры. Удалим дефолтный конструктор из класса и попробуем запустить наш код снова. Что-то пошло не так! Мы получили ошибку, потому что вызвали метод для создания объекта через конструктор по умолчанию. А ведь такого конструктора у нас теперь нет. Значит при работе метода newInstance() механизм рефлексии будет использовать наш старый конструктор с двумя параметрами: А с параметрами-то мы ничего не сделали, как будто вообще забыли о них! Чтобы передать их в конструктор с помощью рефлексии, придется немного «похимичить»: Вывод в консоль: Давай рассмотрим подробнее, что в нашей программе происходит. Мы создали массив объектов Class . Они соответствуют параметрам нашего конструктора (у нас там как раз параметры String и int ). Мы передаем их в метод clazz.getConstructor() и получаем доступ к нужному конструктору. После этого остается только вызвать метод newInstance() с нужными параметрами и не забыть явно привести объект к нужному нам классу — Cat . В результате наш объект успешно создастся! Вывод в консоль: Едем дальше 🙂
Как получить и установить значение поля объекта по имени
Как вызвать метод объекта по имени
Производительность снижается. У методов, которые вызываются с помощью рефлексии, меньшая производительность по сравнению с методами, которые вызываются обычным способом.
Есть ограничения по безопасности. Механизм рефлексии позволяет менять поведение программы во время выполнения (runtime). Но в твоем рабочем окружении на реальном проекте могут быть ограничения, не позволяющие этого делать.
Риск раскрытия внутренней информации. Важно понимать, что использование рефлексии напрямую нарушает принцип инкапсуляции: позволяет нам получить доступ к приватным полям, методам и т.д. Думаю, не стоит объяснять, что к прямому и грубому нарушению принципов ООП стоит прибегать только в самых крайних случаях, когда иных способов решить задачу не существует по не зависящим от тебя причинам.