C ++: проблема Semanti c в дочернем классе с тем же именем метода - PullRequest
0 голосов
/ 17 марта 2020

Это вопрос о проектировании классов в C ++.

В моем базовом классе есть виртуальный финальный метод с параметрами, имя которого в основном "update". В дочернем классе я хотел использовать высокоуровневый способ обновления объекта, поэтому я также создал метод под названием «update» (для удобства), но у этого нет параметра. И Clang предупреждает меня, что метод скрывает метод базового класса. С моей точки зрения, я не совсем согласен с этим, потому что подпись другая, она должна просто завершить перегрузку.

Есть ли веская причина не делать этого?

1 Ответ

1 голос
/ 17 марта 2020

Предупреждение говорит о том, что функция в производном классе затрудняет вызов исходной функции базового класса для объекта производного типа:

class Base {
public:
    virtual void update(int param) final;
};

class Derived : public Base {
public:
    void update();
};

void f(Derived& obj) {
    obj.update(2); // Error!
    // Name lookup for update finds only Derived::update,
    // which takes no arguments
}

Чтобы "показать" базовый класс функция, чтобы производный класс действовал так, как если бы он имел обе перегрузки, используйте директиву using:

class Derived : public Base {
public:
    void update();
    using Base::update;
};
...