我似乎无法使多级继承函数调用正常工作。对于我的结构,我有一个“实体”作为主要的超类然后
实体 - > Bullet,Agent
代理 - >玩家,敌人
敌人 - > 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);
只有每一个都进入“代理”更新功能,如果我使代理更新功能纯虚拟,它只是进入实体更新功能,为什么玩家和敌人更新功能不会覆盖基本功能?
答案 0 :(得分: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