从向量中调用派生类函数(c ++)

时间:2011-03-11 08:22:50

标签: c++ class function vector

我有两个班级:

class Object {
public:
  Object();
  virtual void update();
  virtual void draw();

private:

protected:
  int x, y, tick;

}

class Unit : public Object {
public:
  Unit();
  void update();

private:

protected:

}

然后我在sepparate .cpp文件中定义构造函数和函数。

这是Object的定义:

Object::Object() {
  x = y = 0;
};

Object::update() {
  tick ++;
};

Object::draw() {
  // All my draw code is in here.
};

单位:

Unit::Unit() : Object() {

};

Unit::update() {
  Object::update();
  // Then there's a bunch of movement related code here.
};

一切都可以单独运行,但在尝试从向量中调用函数时遇到了问题。

vector<Object> objects;

然后我在我的void main()中执行此操作:

for (int i = 0; i < objects.size(); i ++) {
  objects[i].update();
  objects[i].draw();
};

这样可以很好地绘制所有内容,但它只调用update()的Object verson而不是派生类定义的版本。我是否必须为从Object类派生的每种类型创建一个向量,以便它可以工作,还是有另一种方法来调用派生函数?

提前致谢 - Seymore

2 个答案:

答案 0 :(得分:6)

是的,它调用class Object的方法,因为你有class Object个对象的向量:

vector<Object> objects; // stores instances of class Object

可能的解决方案是使用指针向量:

vector<Object*> objects;
objects.push_back( new Unit() );

然后通过指针调用:

for (int i = 0; i < objects.size(); i ++) {
    objects[i]->update();
    objects[i]->draw();
}

答案 1 :(得分:1)

如果你想在C ++中使用面向对象的多态(意思是:你有一个基类和派生类,并且在运行时你可以遇到任何关闭的那些)你必须使用指针。

vector<Object *> objects;

这意味着手动内存管理(但你可以使用shared_pointers或http://www.boost.org/doc/libs/1_35_0/libs/ptr_container/doc/ptr_container.html),并且可能会有轻微的性能损失(因为有一个额外的解除引用和v-table,但你不应该真的关心它)。别忘了让你的方法变得虚拟;)

我认为这就是我在日常工作中很少使用面向对象编程的原因,因为我在学校学习了它;)我使用遗产,但不要在同一个容器中混合使用母语和daugther类(我使用模板很多接口)。