これは例が悪かったのかな。もう一度プログラムを書いてみる。
これは擬似コードなので動かないし、NULLチェックとかもしてないよ。

// 描画系のメソッドは略
class TaskBase {
public:
typedef @ FuncType;
TaskBase() : m_func(&TaskBase::begin_task) {}
void set_task(FuncType func) {m_func = func; /*A*/ }
void update() { m_func(); }
protected:
virtual void begin_task() {}
private:
FuncType m_func;
};

class Task1 : TaskBase {
public:
Task1() {}
protected:
void begin_task() { set_task(&Task1::task1); }
void task1() {}
};

class Task2 : TaskBase {
public:
Task2() {}
protected:
void begin_task() { set_task(&Task2::task1); }
void task1() {}
};