Методы getSelf в классах-потомках отличаются от метода getSelf класса Base возвращаемым типом — и, соответственно, не перегружают его, а скрывают (о чем компилятор наверняка пишет warning). Классы Derived1 и Derived2 не имеют перегруженного метода Base* getSelf(), и наследуют его от базового класса. Таким образом, в строчке, где возникает ошибка, всегда вызывается метод Base::getSelf.
Сделать то, что хочется, можно так (это, фактически, паттерн Visitor):
class Base
{
public:
virtual void testMe(Tester* t) = 0;
};
class Derived1 : public Base
{
public :
virtual void testMe(Tester* t)
{ t->Test(this);}
};
class Derived2 : public Base
{
public :
virtual void testMe(Tester* t)
{ t->Test(this);}
};