Нет.Вектор базового класса сам по себе не является базовым классом вектора производного класса.
Рассмотрим, вставил ли DrawItems объект Vector2D, который является не MapImage, в элементы:у вас будет что-то, что не является MapImage в векторе .Тем не менее, поскольку DrawItems имеет векторэта вставка была бы совершенно правильной с ее точки зрения.
Вместо этого передайте диапазон и шаблон итератора на итератор:
void DrawItem(SDL_Surface *dest, Vector2D &item, SDL_Surface *image);
template<class Iter>
void DrawItems(SDL_Surface *dest, Iter begin, Iter end, SDL_Surface *image) {
for (; begin != end; ++begin) {
DrawItem(dest, *begin, image);
}
}
Или на контейнер:
template<class Container>
void DrawItems(SDL_Surface *dest, Container &items, SDL_Surface *image) {
typename Container::iterator begin = items.begin(), end = items.end();
for (; begin != end; ++begin) {
DrawItem(dest, *begin, image);
}
}
Или вместо DrawItems вообще, но все еще с DrawItem, как я объявил выше, возможно, используйте новомодный цикл for-each:
// this: DrawItems(dest, healthpacks, healthpack_image);
// becomes:
for (auto &x : healthpack) DrawItem(dest, x, healthpack_image);
Также кажется, что вам нужно добавить const, но я 'оставил код как у тебя.