我有两个班级:
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
答案 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类(我使用模板很多接口)。