2012-04-19 92 views
0

我遇到以下代码的问题,重写虚拟函数未执行。不知道我在这里做错了可能是一个愚蠢的错误。反正这是一个游戏项目,我有对象的数组,看起来像这样(核心::阵列是Irrlicht的阵列,类似于矢量阵列)如何在C++中正确使用虚拟成员函数

core::array<GameObject> gameTargets; 

这是GameObjectZombie定义

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虚函数包含游戏对象

+0

行数组如果声明无效僵尸::拍摄(会发生什么诠释)为虚拟?你使用什么编译器? – Joel 2012-04-19 14:15:18

+0

我正在使用visual express C++,我尝试在派生类中使用虚函数,但它没有工作,我怀疑它正在切片在 – 2012-04-19 14:18:04

+0

下面给出的答案@DannyBirch:在派生类中使用'virtual'关键字没有什么区别,如果你愿意,你也可以忽略它。重要的是它在基类中是“虚拟”的。 – 2012-04-19 14:24:00

回答

7

我怀疑您遇到切片,因为gameTargets数组包含值。我无法确定,因为我不知道core::array模板的工作原理。有关切片的讨论,请参阅What is object slicing?

要解决这个问题,将任一原始指针在

core::array<GameObject *> gameTargets; 

或者使用某种形式的引用计数指针像

core::array<std::shared_ptr<GameObject>> gameTargets; // only available in C++11 
+0

好的,我看看切片。谢谢! – 2012-04-19 14:15:45

0

一个快速的解决办法是让那些家长的功能纯虚函数,如:

virtual void shot(int dmg) { } = 0; 

//编辑 并使用Frerich Raabe建议的指针阵列

+2

我认为这不会解决任何问题;实际上,代码可能甚至不再编译,因为'core :: array '类型不能再被实例化,因为由于纯虚拟方法,GameObject是抽象的。 – 2012-04-19 14:18:31

+0

是的,这就是为什么我需要编辑我的帖子;我认为他拥有指针数组......(不知道我是如何遗漏数组中的丢失指针) – Ivica 2012-04-19 14:23:16

1

array<GameObject>是对象的容器,而不是指针的容器。添加到它的每个对象都将是一个GameObject,而不是其中一个派生类(如果添加派生类对象,则它将被“切片”)。

不知道你core::array究竟是干什么的,我怀疑你真的打算创建是std::unique_ptr<GameObject>(智能指针)沿

core::array< std::unique_ptr<GameObject> > gameTargets; 
std::unique_ptr<GameObject> my_zombie(new Zombie); 
gameTargets.push_back(my_zombie);