class Task {
 Worker* m_worker;
 Work m_work;
public:
 void execute() { m_worker->(*m_work)(); }
};

の部分は

class Task {
 Worker* m_worker;
 Work m_work;
public:
 void execute() { m_worker->(*m_work)(Task); }
};

にした方がいいですかね?
じゃないと、処理メソッドの中で自殺等できませんよね?
でも、処理メソッドの中でdelete Taskとかされたらこまりますよね…