2016-12-31 62 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