Учитывая базовый класс gameObject
и производный класс animatedGameObject
, я думал, что может быть хорошо хранить все их экземпляры в std::vector
. Если объявлено, что вектор GameObjects
является базовым типом gameObject*
, производные экземпляры объектов требуют кастинга.Существуют ли риски производительности для использования static_cast для работы с вектором смешанных (базовых и производных) объектов? (aka «это эта немая идея?»)
Пример:
vector<gameObject*> GameObjects;
gameObject A* = new gameObject(...init...);
animatedGameObject B* = new animatedGameObject(...init...);
GameObjects.push_back(A);
GameObjects.push_back(B);
// to access the animatedGameObject functions:
static_cast<animatedGameObject*>(GameObjects[1])->functionUniqueToAnimated();
Опасаясь, как обычно, я обратился к Скотт Мейерс (Эффективное использование C++, 3-е издание), который пишет на эту тему:
Многие программисты считают, что забросы ничего не делать но скажите компиляторам рассматривать один тип как другой, но это ошибочно. Преобразования типов любого типа (либо явные с помощью приводов, либо неявные компиляторами) часто приводят к коду, который выполняется во время выполнения.
Я прочитал его Пункт 27: Минимизацию Кастинг дважды, но учитывая мою неопытность с этим, я борюсь с моей неспособностью ответить на простой вопрос «ЭТО немое, что нужно сделать?»
Следует отметить, что существует несколько причин, почему это является немым, что нужно сделать, что не имеет ничего общего с вызовом static_cast
. Вопросы, в порядке важности:
- Am Я не вижу некоторые возможные риски, с использованием
static_cast
в моем примере выше? - Есть ли лучшие структуры данных, чем
std::vector
для таких подходов? (только если есть очевидное, я не прошу вас провести мое исследование для меня.)
Это мой первый вопрос, задающий здесь вопрос, поэтому приносим извинения заранее, где это необходимо.
+1 для чтения Эффективный C++ – Borgleader
Обычным делом было бы определить 'draw()' как виртуальную функцию в базовом классе. Тогда вы могли бы просто называть его без кастингов, и это было бы правильно. Знаете ли вы об этом, но хотите узнать о эффектах броска конкретно? – jogojapan
'boost :: ptr_vector' – Mehrdad