>処理するメソッドへのポインタを利用して処理を飛ばすという、
>なんとも汚いものになった。

あまり解釈に自信がないんだけど、例えばこういうの? 汚いかなあ。

typedef void(Task::*TaskFunc)();

class Task {
public:
  void SetMethod(TaskFunc updateFunc) { m_updateFunc = updateFunc; }
  void Update() { (this->*m_updateFunc)(); }
private:
  TaskFunc m_updateFunc;
};

class HogeTask : public Task {
public:
  HogeTask() {
    SetFunc((TaskFunc) Func1);
  }
  void Func1() {
    ...
    SetFunc((TaskFunc) Func2);
  }
  void Func2() { ... }
  void Func3() { ... }
};