c ++多级继承不起作用[重复]
Posted
技术标签:
【中文标题】c ++多级继承不起作用[重复]【英文标题】:c++ multilevel inheritance not working [duplicate] 【发布时间】:2016-12-31 17:34:33 【问题描述】:我似乎无法让多级继承函数调用正常工作。对于我的结构,我有一个“实体”作为主要的超类,然后
实体 -> 子弹,特工
代理 -> 玩家,敌人
敌人 -> 基本敌人
在每一个中我都有一个“更新”功能
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);
它只进入“代理”更新功能,如果我将代理更新功能设为纯虚拟,它只进入实体更新功能,为什么玩家和敌人更新功能不覆盖基本功能?
【问题讨论】:
【参考方案1】:这是因为您将 objects 存储在向量中。您应该存储对象的指针。
详情:
在 C++ 中,如果您将 Agent
object 转换为 Entity
object,您将丢失有关 Agent
的所有信息,并且新对象将是真正的 @987654326 @。 IE。你失去了多态行为。
当您创建一个带有Entity
对象的向量并在其中推送和Agent
对象时会发生这种情况,因为存储的对象将是纯Entity
对象。
在 C++ 中,引用和指针保持多态性。因此,要解决这个问题,您应该创建一个指针向量:
std::vector< Entity* > entities;
entities.push_back( new Agent( ) );
entities[ 0 ]->update( 5); // Agent::update will be called
【讨论】:
另见:***.com/questions/274626/what-is-object-slicing 补充阅读:What is object slicing?以上是关于c ++多级继承不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Codeigniter:多级模型扩展不起作用。收到错误“找不到类”