Скажем, vehicle
- это базовый класс, который обладает определенными свойствами, поэтому, наследуя от него, вы скажете car
и truck
. Тогда вы можете просто сделать что-то вроде:
std::vector<vehicle *> parking_lot;
parking_lot.push_back(new car(x, y));
parking_lot.push_back(new truck(x1, y1));
Это было бы совершенно правильно, а иногда очень полезно. Единственное требование для этого типа обработки объектов - разумная иерархия объектов.
Другими популярными типами объектов, которые можно использовать подобным образом, являются, например, people
:) вы видите это почти в каждой книге по программированию.
EDIT:
Конечно, этот вектор может быть упакован с boost::shared_ptr
или std::tr1::shared_ptr
вместо необработанных указателей для простоты управления памятью. И на самом деле это то, что я бы рекомендовал сделать всеми возможными способами.
EDIT2:
Я удалил не очень соответствующий пример, вот новый:
Допустим, вам необходимо реализовать какую-либо функцию сканирования AV, и у вас есть несколько механизмов сканирования. Таким образом, вы реализуете некоторый класс управления двигателем, скажем, scan_manager
, который может вызывать bool scan(...)
функцию из них. Затем вы создаете интерфейс двигателя, скажем engine
. Он будет иметь virtual bool scan(...) = 0;
Затем вы создадите несколько engine
s, таких как my_super_engine
и my_other_uber_engine
, которые оба наследуются от engine
и реализуют scan(...)
. Тогда ваш менеджер движков где-то во время инициализации будет заполнять эти std::vector<engine *>
экземплярами my_super_engine
и my_other_uber_engine
и использовать их, вызывая bool scan(...)
для них либо последовательно, либо на основе любых типов сканирования, которые вы хотите выполнить. Очевидно, что эти движки делают в scan(...)
, остается неизвестным, единственный интересный момент - это bool
, поэтому менеджер может использовать их все одинаково без каких-либо изменений.
То же самое можно применить к различным игровым юнитам, таким как scary_enemies
, и это будут orks
, drunks
и другие неприятные существа. Все они реализуют void attack_good_guys(...)
, и ваш evil_master
сделает многие из них и вызовет этот метод.
Это действительно обычная практика, и я вряд ли назвал бы это плохим дизайном, если все эти типы на самом деле связаны.