如何创建一个对象向量,这些对象继承自相同的基 类 并具有独特的功能?
How to create a vector of objects which inherit from the same base classes and have unique functions?
我想创建继承自同一个基 class 但有自己的函数的对象向量,这些函数不在基 class 中(创建虚函数是不可能的,因为class继承的es将不同的变量作为函数的参数。
基地class:型号
第一个 class 继承自模型 class: Bus
void Bus::draw_model_bus(angle_x, angle_y, P_scene, V_scene, M_scene) const;
第二个 class 继承自模型 class:草
void Grass::draw_model_grass(P_scene, V_scene, M_scene) const;
... 我希望能够在存储在这个模型向量中的 Bus 和 Grass 对象上调用上述函数。 std::vector<Model*> models;
下面的代码不起作用:
models[0]->draw_model_bus(angle_x, angle_y, P_scene, V_scene, M_scene);
models[1]->draw_model_grass(P_scene, V_scene, M_scene);
我想像这样初始化这些对象:
// Bus
models.emplace_back(Bus("res/models/Bus.obj", "res/textures/Bus_tex.tga.png"));
models[0]->read_model();
// Grass
models.emplace_back(Grass("res/models/grass.obj", "res/textures/grass.png"));
models[1]->read_model();
如何才能像我上面描述的那样存储这些对象?
恐怕您想要实现的目标无法通过简单的方式实现。那是因为您尝试使用的 C++ 机制并非旨在以这种方式使用。
继承 - 在以下情况下您会使用它:
- 你想重用接口,这里好像不是这样,因为你想要不同的函数名;
- 或者,您想要重用该实现,也就是已经存在于基础 class.
中的通用代码
为了解决您使用不同参数的问题,您可以将它们封装到一个包装器对象中,该对象可以从第一组或第二组创建。像这样:
class Input {
public:
Input(int angle_x, int angle_y, int P_scene, int V_scene, int M_scene);
Input(int P_scene, int V_scene, int M_scene);
...
};
class Model {
public:
virtual void draw(const Input& in);
...
};
class Bus: public Model {
public:
void draw(const Input& in) override;
...
};
class Grass: public Model {
public:
void draw(const Input& in) override;
...
};
int main() {
std::vector<Model*> models;
...
models[0]->draw(Input(angle_x, angle_y, P_scene, V_scene, M_scene));
models[1]->draw(Input(P_scene, V_scene, M_scene));
}
我想创建继承自同一个基 class 但有自己的函数的对象向量,这些函数不在基 class 中(创建虚函数是不可能的,因为class继承的es将不同的变量作为函数的参数。
基地class:型号
第一个 class 继承自模型 class: Bus
void Bus::draw_model_bus(angle_x, angle_y, P_scene, V_scene, M_scene) const;
第二个 class 继承自模型 class:草
void Grass::draw_model_grass(P_scene, V_scene, M_scene) const;
... 我希望能够在存储在这个模型向量中的 Bus 和 Grass 对象上调用上述函数。 std::vector<Model*> models;
下面的代码不起作用:
models[0]->draw_model_bus(angle_x, angle_y, P_scene, V_scene, M_scene);
models[1]->draw_model_grass(P_scene, V_scene, M_scene);
我想像这样初始化这些对象:
// Bus
models.emplace_back(Bus("res/models/Bus.obj", "res/textures/Bus_tex.tga.png"));
models[0]->read_model();
// Grass
models.emplace_back(Grass("res/models/grass.obj", "res/textures/grass.png"));
models[1]->read_model();
如何才能像我上面描述的那样存储这些对象?
恐怕您想要实现的目标无法通过简单的方式实现。那是因为您尝试使用的 C++ 机制并非旨在以这种方式使用。
继承 - 在以下情况下您会使用它:
- 你想重用接口,这里好像不是这样,因为你想要不同的函数名;
- 或者,您想要重用该实现,也就是已经存在于基础 class. 中的通用代码
为了解决您使用不同参数的问题,您可以将它们封装到一个包装器对象中,该对象可以从第一组或第二组创建。像这样:
class Input {
public:
Input(int angle_x, int angle_y, int P_scene, int V_scene, int M_scene);
Input(int P_scene, int V_scene, int M_scene);
...
};
class Model {
public:
virtual void draw(const Input& in);
...
};
class Bus: public Model {
public:
void draw(const Input& in) override;
...
};
class Grass: public Model {
public:
void draw(const Input& in) override;
...
};
int main() {
std::vector<Model*> models;
...
models[0]->draw(Input(angle_x, angle_y, P_scene, V_scene, M_scene));
models[1]->draw(Input(P_scene, V_scene, M_scene));
}