我遇到以下代码的问题,重写的虚函数没有执行.不确定我在这里做错了可能是一个愚蠢的错误.无论如何这是一个游戏项目,我有一个看起来像这样的对象数组(核心::数组是一个irrlicht数组,类似于向量数组)
core::array<GameObject> gameTargets;
Run Code Online (Sandbox Code Playgroud)
这是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) {
...
}
};
Run Code Online (Sandbox Code Playgroud)
永远不会调用派生类的成员函数,我正在创建这样的对象
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);
}
}
Run Code Online (Sandbox Code Playgroud)
其中b是指向具有int变量损坏的子弹的指针,gameTargets包含GameObject
我怀疑你正在经历切片,因为gameTargets数组包含值.我无法确定,因为我不知道core::array模板是如何工作的.请参阅什么是对象切片?关于切片是什么的讨论.
要解决此问题,请将原始指针存储为
core::array<GameObject *> gameTargets;
Run Code Online (Sandbox Code Playgroud)
或者使用某种引用计数指针
core::array<std::shared_ptr<GameObject>> gameTargets; // only available in C++11
Run Code Online (Sandbox Code Playgroud)