у меня есть что-то вроде этого
class A {
virtual void doBla(A *a) = 0;
};
class B : public A {
virtual void doBla(B *b) { // do stuff ;};
};
и я хочу сделать что-то как
A* a = new B();
B* b = new B();
a->doBla(b);
или: у всех детей A, как предполагается, есть метод doBla, который берет параметр типа ребенка. Надежда Вы получаете мою проблему и надеетесь, что кто-то может помочь мне или убедить меня, что это - плохой стиль :)
править: добавленный виртуальный к методам
Вы не можете перегружать функции в базовых / дочерних классах, а функция-член doBla
класса
должна быть общедоступной, если вы хотите вызвать ее извне:
class A {
public:
virtual void doBla(A *a) = 0;
};
class B : public A {
virtual void doBla(A *a) { /*do stuff*/ }
};
Изменить: Примечание что объявление функции doBla
аналогично в классах A и B.
Это невозможно в существующем виде - 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
};
Проблема в том, что вы должны знать все производные типы в базовом классе, что не всегда возможно или выполнимо.