【问题标题】:How to create a vector of objects which inherit from the same base classes and have unique functions?如何创建从相同基类继承并具有独特功能的对象向量?
【发布时间】:2021-10-07 08:22:11
【问题描述】:

我想创建从同一个基类继承但有自己的函数的对象向量,这些函数不在基类中(创建虚函数是不可能的,因为继承的类将不同的变量作为参数一个函数)。

基类:模型

从Model类继承的第一个类:Bus

void Bus::draw_model_bus(angle_x, angle_y, P_scene, V_scene, M_scene) const;

继承自Model类的第二个类:Grass

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();

如何像我上面描述的那样存储这些对象?

【问题讨论】:

  • 要存储指针,您需要使用new 但是,我建议使用shared_ptr 的向量
  • ^^^ 即使在那之后,您对集合的可疑选择以及调用特定于派生的非虚拟成员的愿望将需要一些有针对性的 dynamic_pointer_cast 用法。
  • @ChrisMM 则无法调用 draw_model_bus 和 draw_model_grass 函数。
  • 除非基类将它们定义为虚拟方法,否则不会。您是否熟悉虚拟方法及其工作原理?
  • 那是抽象函数,而不仅仅是一个虚函数。在基类中实现它们,以引发异常,指示它们被错误类型的对象调用。

标签: c++ function inheritance vector virtual


【解决方案1】:

恐怕您想要实现的目标无法通过简单的方式实现。那是因为您尝试使用的 C++ 机制并非旨在以这种方式使用。

继承 - 你会在以下情况下使用它:

  • 你想复用接口,这里好像不是这样,因为你想要不同的函数名;
  • 或者,您希望重用实现,即基类中已经存在的通用代码。

为了解决您使用不同参数的问题,您可以将它们封装到一个包装器对象中,该对象可以从第一组或第二组创建。像这样的:

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));
}

【讨论】:

  • 如何访问in的单独变量? in->angle_x 和 in.angle_x 不起作用。
  • @code_rushh 你想在哪里访问它们?
  • 在函数draw_model中。是否需要在 Input 类中创建变量?
  • 我假设 draw_model 您的意思是绘制。是的,输入类可能需要相应地调用一些成员变量来存储状态。您必须将它们公开或向它们提供公共访问器......
猜你喜欢
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多