使用“超类”对象来处理继承的类

时间:2014-12-29 16:40:23

标签: c++ inheritance

我正在制作一个解决许多类似问题的程序。

我从一个类似于(例如)的类开始:

class problem {
  void init();
  void solve();
  int print_result();
}

但是我想将这个课程扩展到不同的问题:

class problem_A : problem {
  void init();
  void solve();
  void print_result();
}

class problem_B : problem {
  void init();
  void solve();
  void print_result();
}

...

但是在主界面中我想为一个问题(A,B,......)设置一个对象并处理它们:

obj.init();
obj.solve();
obj.print_result();

我如何实现这一目标?应该是什么类型的?

2 个答案:

答案 0 :(得分:2)

如果您总是想要init()然后solve()然后print_result(),最好将其包含在(对于C ++)笨拙命名的模板方法模式中:

class problem {
public:
    virtual ~problem() = default;

    void run() {
        init();
        solve();
        print_result();
    }

protected:
    virtual void init() = 0;
    virtual void solve() = 0;
    virtual void print_result() = 0;
};

然后,每个明确的问题都必须为这些函数提供实现:

class problem_A : public problem {
protected:
    void init() override { .. }
    void solve() override { .. }
    void print_result() override { .. }
};

problem* p = new problem_A(..);
p->run(); // inits, solves, and prints the results for problem A

答案 1 :(得分:1)

您坚持使用原始课程,但要将方法设为纯virtual

class problem {
  virtual void init() = 0;
  virtual void solve() = 0;
  virtual int print_result() = 0;
}

然后你可以override派生类中的这些函数

class problem_A : problem {
  virtual void init() override;
  virtual void solve() override;
  virtual void print_result() override;
}

然后你可以按如下方式制作你的对象:

problem* obj = new problem_A;
obj->init();
obj->solve();
obj->print_result();

这将调用problem_A的方法,但您可以使用指向基类problem的指针。显然要确保你清理内存

delete obj;

或使用智能指针

std::unique_ptr<problem> = std::unique_ptr<problem>(new problem_A);