[英]How to properly use virtual member functions in c++
我的以下代碼有問題,重寫的虛函數未執行。 不知道我在這里做錯了可能是一個愚蠢的錯誤。 無論如何,這是一個游戲項目,我有一個看起來像這樣的對象數組(core :: array是一個irrlicht數組,類似於vector數組)
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
我懷疑您正在切片,因為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.