我在这里遗漏了什么吗?还是有理由不允许这样做?
// the class declaration
class MapImage : public MapEntity, public Vector2D {};
// the variable declaration
std::vector<MapImage> healthpacks;
// the function
void DrawItems(SDL_Surface *dest, std::vector<Vector2D> &items, SDL_Surface *image);
// the implementation
DrawItems(dest, healthpacks, healthpack_image);
因为healthpacks是MapImage类的std :: vector,而MapImage具有基类Vector2D,所以不应该“std :: vector healthpacks”与“std :: vector&amp; items”兼容,因为它们具有相同的基类?
答案 0 :(得分:5)
没有。基类的向量本身不是派生类的向量的基类。
考虑DrawItems是否将一个Vector2D对象(不一个MapImage)插入到项目中:你将在向量&lt; MapImage&gt;中有一些不是MapImage的东西。但是,由于DrawItems有一个向量&lt; Vector2D&gt;,从它的角度来看,这种插入是完全有效的。
相反,在迭代器上传递迭代器范围和模板:
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,但我已经离开了代码,就像你拥有它一样。
答案 1 :(得分:1)
嗯,不。
当然,您可以从MapImage向上转换为Vector2D,但向量&lt;&gt;是不相关的类型。 您是期待直接案例还是要创建副本?由于对向量&lt;&gt;的非const引用,后者不会发生。
为什么呢?支持这些只是数组,迭代器需要知道记录的大小,这对于不同的类型会有所不同。