Унаследованный метод с другим типом - PullRequest
1 голос
/ 12 августа 2010

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

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

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

Ответы [ 2 ]

1 голос
/ 12 августа 2010

Это невозможно в нынешнем виде - 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 голос
/ 12 августа 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...