2016-12-31 61 views
3

我似乎無法獲得多級繼承函數調用正常工作。對於我的結構我有一個 「實體」 爲主體的超類,那麼C++多級繼承不起作用

實體 - >子彈,代理

代理 - >播放器,敵人

的敵人 - > BasicEnemy

在每這些我有一個「更新」功能

class Entity 
{ 
public: 
    Entity(); 
    virtual ~Entity(); 
    //stuff 
    virtual Bullet update(float deltaTime); 
} 


class Agent : public Entity 
{ 
public: 
    Agent(); 
    virtual ~Agent(); 

    virtual Bullet update(float deltaTime); 

class Player : public Agent 
{ 
public: 
    Player(); 
    ~Player(); 

    Bullet update(float deltaTime) override; 

class Enemy : public Agent 
{ 
public: 
    Enemy(); 
    virtual ~Enemy(); 

    virtual Bullet update(float deltaTime); 

class BasicEnemy : public Enemy 
{ 
public: 
    BasicEnemy(); 
    ~BasicEnemy(); 

    Bullet update(float deltaTime) override; 

創建播放器,敵人,子彈物體,然後將它們傳遞到實體的載體但是每當我打電話

Entity entity = entities[i]; 
entity.update(deltaTime); 

它只是每個進入「代理」更新功能,如果我做代理更新功能的純虛它只是給實體更新功能,爲什麼不播放器和敵人的更新功能覆蓋基地功能?

回答

5

這是因爲你存儲對象在向量中。您應該存儲對象的指針

詳情: 在C++中,如果你投一個Agent對象Entity對象你失去所有關於Agent和新的對象將是一個真正的Entity的信息。即你放棄了多態行爲。

發生這種情況時,您創建了一個向量與Entity對象,並推動和Agent對象,因爲存儲的對象將是純的Entity對象。

在C++中,引用和指針保持多態。因此,要解決這個問題,你應該創建一個指針的向量:

std::vector< Entity* > entities; 
entities.push_back(new Agent()); 
entities[ 0 ]->update(5); // Agent::update will be called 
+2

參見:http://stackoverflow.com/questions/274626/what-is-object-slicing – tmpearce

+0

補充閱讀:[什麼是對象切片?](http://stackoverflow.com/questions/274626/what-is-object-slicing) – user4581301