Наследование C ++ и одинаковые имена функций - PullRequest
2 голосов
/ 26 мая 2020

У меня такая ситуация:

class A
{
  public:
    A();
    virtual ~A();
    void doSomething();
};


class B : public A
{
  public:
    B();
    void doSomething(int parameter);
};

Если я сделаю следующее:

int main()
{
  B b;
  b.doSomething();
}

Это дает мне ошибку компиляции (нет функции сопоставления). Как я могу решить эту проблему, не меняя имя функции B? B является производным от A, поэтому он также имеет функцию doSomething() без параметров. Почему не работает? Спасибо за помощь.

Ответы [ 2 ]

3 голосов
/ 26 мая 2020

В настоящее время B::doSomething скрывает A::doSomething.

Вы можете использовать using для решения вашей проблемы:

class B : public A
{
  public:
    using A::doSomething;
    B();
    void doSomething(int parameter);
};
1 голос
/ 26 мая 2020

Этот ответ является альтернативой этому решению на случай, если вам не разрешено изменять класс B.


Если вам не разрешено изменять класс B для добавления using A::doSomething; внутри класса (как уже было предложено здесь ), вы можете взять указатель на функцию-член A::doSomething(), а затем вызвать его через указатель этой функции-члена на экземпляре b:

auto fptr = &A::doSomething;
B b;
(b.*fptr)();

или проще, при правильной квалификации функции-члена указатель на функцию-член не требуется:

B b;
b.A::doSomething(); // calls A::doSomething()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...