Унаследованный метод с другим типом

у меня есть что-то вроде этого

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, который берет параметр типа ребенка. Надежда Вы получаете мою проблему и надеетесь, что кто-то может помочь мне или убедить меня, что это - плохой стиль :)

править: добавленный виртуальный к методам

1
задан Dirk 12 August 2010 в 10:48
поделиться

2 ответа

Вы не можете перегружать функции в базовых / дочерних классах, а функция-член doBla класса должна быть общедоступной, если вы хотите вызвать ее извне:

class A {
  public:
    virtual void doBla(A *a) = 0;
};

class B : public A {
    virtual void doBla(A *a) { /*do stuff*/ }
};

Изменить: Примечание что объявление функции doBla аналогично в классах A и B.

1
ответ дан 2 September 2019 в 22:13
поделиться

Это невозможно в существующем виде - 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
};

Проблема в том, что вы должны знать все производные типы в базовом классе, что не всегда возможно или выполнимо.

1
ответ дан 2 September 2019 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: