使用具有模板基类的类作为基类参数

时间:2011-01-21 05:04:29

标签: c++ class inheritance vector arguments

我在这里遗漏了什么吗?还是有理由不允许这样做?

// 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”兼容,因为它们具有相同的基类?

2 个答案:

答案 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引用,后者不会发生。

为什么呢?支持这些只是数组,迭代器需要知道记录的大小,这对于不同的类型会有所不同。