Это невозможно в нынешнем виде - a не имеет функции doBla (B * b), поэтому при попытке вызвать ее в экземпляре a компилятор не может гарантировать, что функция действительно существует, он не знает, как это искать. Это ошибка или десять.
Возможно, вам нужна двойная отправка.
class A {
public:
virtual void doBla(A* a) { a->doBla_impl(this); }
private:
virtual void doBla_impl(A* a);
virtual void doBla_impl(B* b);
// etc
};
class B : public A {
public:
virtual void doBla(A* a) { a->doBla_impl(this); }
private:
virtual void doBla_impl(A* a);
virtual void doBla_impl(B* b);
// etc
};
Проблема в том, что вам нужно знать все производные типы в базовом классе, что не всегда возможно или выполнимо.