2012-04-19 48 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);