首页 > 解决方案 > 如何将子类存储在向量中并覆盖父函数

问题描述

我正在尝试用 C++ 和 SDL2 编写来自 YouTube 频道“meth meth method”的 js super-mario 系列。

现在我被困在第 04 集 - https://www.youtube.com/watch?v=1rBOUyRGQuU

我正在尝试创建一个具有Entity类向量的Trait类。我想创建许多不同的类,这些类继承自Trait向量并将它们存储在向量中。我想调用子类更新函数而不是原始的特征更新函数。

// -- Entity.h -----------------------------------

class Entity {
private:
    Vec2 vel;
    std::vector<Trait*> traits;

public:
    Vec2 pos;
    // Constructor & Destructor
    Entity(void);   
    ~Entity(void);

    void addTrait(Trait* nTrait);

    void update();
};

// -- Entity.cpp -----------------------------------

void Entity::addTrait(Trait* newTrait) { 
    this->traits.push_back( newTrait );
}

void Entity::update() {

    for ( Trait* trait : this->traits ) {
        trait->update(  );
    }    
}

// -- Trait.h -----------------------------------
class Trait {
private:
    std::string name;
public:
    // Constructor & Destructor
    Trait(std::string aname );
    ~Trait(void);

    void update( void );
};
// -- Trait.cpp -----------------------------------
void Trait::update(  ) {
    printf("Trait update\n");
}

以及来自 Trait 的 Velocity.h 子类

// -- Velocity.h -----------------------------------
class Velocity : public Trait {
private:
public:
    // Constructor & Destructor
    Velocity(std::string aname);
    ~Velocity(void);

    void update(Entity *entity);
};
// -- Velocity.cpp -----------------------------------
void Velocity::update(Entity *entity ) {
    printf("Velocity update\n");
    entity->setPos(0, 0);
}

我尝试了许多不同的版本,并得到了不同的错误。现在我让它工作了,当我向实体添加速度特征并调用实体的更新方法(循环所有特征)时,只有更新函数从父特征类(打印“特征更新”和不是“速度更新”)。

主文件

    Entity *mario = new Entity();

    mario->setPos( 64, 180 );
    mario->setVel(  2, -2 );

    Velocity* velTrait = new Velocity("velocity");
    mario->addTrait(velTrait);

    mario->update();

第二个问题是,我想给速度更新函数一个指向实体的指针,这样我就可以改变实体的位置等......

标签: c++oopsdl-2

解决方案


我想创建许多不同的类,这些类继承自Trait向量并将它们存储在向量中。我想调用子类更新函数而不是原始Trait更新函数。

要获得您想要的,请使用以下virtual方法:

virtual void update( void );

更多细节,我建议你学习多态和虚函数。


推荐阅读