【发布时间】:2012-04-19 14:08:12
【问题描述】:
下面的代码有问题,被覆盖的虚函数没有执行。不确定我在这里做错了可能是一个愚蠢的错误。无论如何,这是一个游戏项目,我有一个看起来像这样的对象数组(core::array 是一个 irrlicht 数组,类似于向量数组)
core::array<GameObject> gameTargets;
这是GameObject 和Zombie 的定义
class GameObject {
protected:
scene::ISceneNode* node;
public:
int ID;
int hitpoints;
GameObject() {
...
};
void setNode(scene::ISceneNode* inode) {
...
}
virtual void shot(int dmg) {
... [BREAKPOINT HERE]
}
scene::ISceneNode* getNode() {
return node;
}
};
class Zombie : public GameObject {
public:
static const enum Animation {
ZOMBIE_WALK,
ZOMBIE_HURT,
ZOMBIE_DIE,
ZOMBIE_TWITCH,
ZOMBIE_ATTACK,
ZOMBIE_IDLE
};
//We only want to accepted animated mesh nodes for this object
Zombie(int hp, scene::IAnimatedMeshSceneNode* inode) {
...
}
//Override the shot function
void shot(int dmg) {
... [BREAKPOINT HERE]
}
//Animate the zombie
void setAnimation(Animation anim) {
...
}
};
派生类的成员函数永远不会被调用,我正在创建这样的对象
Zombie target(hp, (scene::IAnimatedMeshSceneNode*)node);
并像这样调用虚函数
for(int i = 0; (u32)i<level->gameTargets.size(); i++) {
if(selectedNode == level->gameTargets[i].getNode()) {
level->gameTargets[i].shot(b->damage);
}
}
其中 b 是指向具有 int 变量伤害的子弹的指针,而 gameTargets 包含 GameObject
【问题讨论】:
-
如果将 void Zombie::shot(int) 声明为虚拟会发生什么?你用的是什么编译器?
-
我正在使用visual express c++,我尝试在派生中使用虚函数,但它不起作用,我怀疑它正在分割下面答案中给出的内容
-
@DannyBirch:在派生类中使用
virtual关键字并没有什么不同,如果您愿意,也可以省略它。重要的是它是基类中的virtual。