簡體   English   中英

如何在C ++中正確使用虛擬成員函數

[英]How to properly use virtual member functions in c++

我的以下代碼有問題,重寫的虛函數未執行。 不知道我在這里做錯了可能是一個愚蠢的錯誤。 無論如何,這是一個游戲項目,我有一個看起來像這樣的對象數組(core :: array是一個irrlicht數組,類似於vector數組)

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包含GameObject

我懷疑您正在切片,因為gameTargets數組包含值。 我不確定,因為我不知道core::array模板是如何工作的。 請參閱什么是對象切片? 討論什么是切片。

要解決此問題,請將原始指針存儲為

core::array<GameObject *> gameTargets;

或者使用某種引用計數的指針,例如

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

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 );

一個快速的解決方案是將那些父函數變成純虛函數,如:

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

//根據Frerich Raabe的建議編輯和使用指針數組

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM