c++ - 如何将子类存储在向量中并覆盖父函数
问题描述
我正在尝试用 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();
第二个问题是,我想给速度更新函数一个指向实体的指针,这样我就可以改变实体的位置等......
解决方案
我想创建许多不同的类,这些类继承自
Trait
向量并将它们存储在向量中。我想调用子类更新函数而不是原始Trait
更新函数。
要获得您想要的,请使用以下virtual
方法:
virtual void update( void );
更多细节,我建议你学习多态和虚函数。
推荐阅读
- ruby - 将文件从本地目录放入站点包的配方中的刀引导“没有这样的文件或目录@ dir_initialize”
- tcp - 将 unix 域套接字转发到 tcp 端口
- javascript - jquery 错误:未捕获的 TypeError:$(...).DataTable 不是函数
- bash - 如何在 sed 中对模式进行颜色匹配
- python - 运行已编译的 Python 脚本时引发了意外的 URLError
- android - Android:播放 YouTube 视频后如何返回上一个屏幕
- angular - 如何使用 matdatepicker 在组件类中以角度打印日期值
- python - 为权重和偏差生成随机向量和矩阵
- python - 无法将文件从 Databricks 保存到桌面
- python - python数学三角函数使用什么算法来计算值?