Так что, если у меня есть разнородная коллекция объектов автомобилей
Автомобиль * c = {грузовик, фургон, кабриолет}
Если коллекция объектов была случайной, и я хотел просмотреть коллекцию с помощью цикла for, как я могу проверить определенный тип объекта?
Вы бы использовали dynamic_cast
:
if (truck* truck_p = dynamic_cast<truck*>(car_p)) {
// car_p points at a truck
}
dynamic_cast
проверит динамический тип объекта, на который указывает car_p
и разрешить приведение, только если это truck
, Если это не truck
, это даст нулевое значение указателя и, следовательно, if
условие не выполнится.
Однако необходимость тестирования такого динамического типа предполагает плохой дизайн кода. Смысл полиморфизма в том, что вы можете обрабатывать любой из производных объектов так, как если бы он был базовым — не нужно проверять, какой именно это был производный тип. Если вам нужно проверить динамический тип Car
так что вы можете сделать некоторые truck
-специфическая операция на нем, то вы не должны бросать это truck
в контейнер Car*
,
Если вам нужно знать производный тип, тогда полиморфизм не является подходящим инструментом для работы. Я бы предложил использовать повышение :: вариант или эквивалент для реализации шаблон посетителя.
Попробуйте посмотреть на RTTI:
http://en.wikipedia.org/wiki/Run-time_type_information
Это информация о типе времени выполнения. Вы также можете добавить переменную-член в каждый производный тип, указав, какой это тип, и использовать его для проверки.