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

Sey*_*ore 4 c++ class function vector

我有两节课:

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

private:

protected:
  int x, y, tick;

}
Run Code Online (Sandbox Code Playgroud)

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

private:

protected:

}
Run Code Online (Sandbox Code Playgroud)

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

这是Object的定义:

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

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

Object::draw() {
  // All my draw code is in here.
};
Run Code Online (Sandbox Code Playgroud)

单位:

Unit::Unit() : Object() {

};

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

一切都可以单独工作,但是在尝试从向量中调用函数时遇到了问题.

vector<Object> objects;
Run Code Online (Sandbox Code Playgroud)

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

for (int i = 0; i < objects.size(); i ++) {
  objects[i].update();
  objects[i].draw();
};
Run Code Online (Sandbox Code Playgroud)

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

提前谢谢 - 塞莫尔

sha*_*oth 6

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

vector<Object> objects; // stores instances of class Object
Run Code Online (Sandbox Code Playgroud)

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

vector<Object*> objects;
objects.push_back( new Unit() );
Run Code Online (Sandbox Code Playgroud)

然后通过指针调用:

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

  • 此问题称为[切片](http://stackoverflow.com/questions/274626/). (3认同)
  • @Seymore:欢迎您,不要忘记处理以后使用`new`创建的对象. (2认同)