ID estático C ++ exclusivo e nome da classe com classe base

Having classTaskBase, cada classe derivada dela deve ter nome e ID exclusiv

OTaskBase é algo como abaixo:

class TaskBase
{
public:
    static const int id()
    {
        // return an unique id, for each object or derived class, HOW ??
    }

    static const string name()
    {
        // return class name for each derived class, HOW ??
        // for example : "TaskBase" for this class
    }
};

A minha tentativa foi:

template <typename DERIVED>
class TaskBase
{
public:

    static const int id() 
    {
        static const int id = reinterpret_cast<int> (typeid (DERIVED).name());
        return id;
    }

    static const string name() 
    {
        static string n;

        if (!n.size())
        {
            int status;
            char *realname = abi::__cxa_demangle(typeid (DERIVED).name(), 0, 0, &status);
            n = realname;
            free(realname);
        }

        return n;
    }
};

Já liest, mas eu preciso da capacidade de ter um ponteiro base para cada classe derivada, algo abaixo da linha:

class MyTask1 : public TaskBase
{
};

MyTask1 myTask1, myTask2;
TaskBase *base = &myTask1;

questionAnswers(3)

yourAnswerToTheQuestion