C++: наследование перегруженного невиртуального метода и виртуального метода оба с тем же именем вызывает проблему

Я пытаюсь наследовать два одинаково именованных метода с различными списками параметров к производному классу. Один из них является виртуальным и переопределяется в производном классе, другой является невиртуальным. Делая так, я получаю ошибку компиляции при попытке получить доступ к невиртуальному методу базового класса от объекта производного класса.

Вот фрагмент кода

class Base {
public: 
    void f() {
        cout << "[Base::f()]" << endl;
    }

    virtual void f(int arg) {
        cout << "[Base::f(" << arg << ")]" << endl;
    }
};


class Deriv : public Base {
public:
    virtual void f(int arg) {
        cout << "[Deriv::f(" << arg << ")]" << endl;
    }
};


int main() {
    Deriv d;
    d.f(-1);    
    d.f();  // <<-- compile error   
    return 0;
}

который производит следующую ошибку компиляции:

ошибка: никакая функция соответствия для вызова к ‘Deriv:: f ()’
примечание: кандидаты: виртуальный пустой Deriv:: f (интервал)

Я не эксперт в C++, но до сих пор мне думавший быть правым в создании предположения, что членские методы могут полностью отличить их подписи. Таким образом, невиртуальная Основа метода:: f () не должен быть переопределен и должен остаться доступным. Я неправильно с этим?

Вот некоторые интересные/дополнительные комментарии что:

    - метод переопределения Deriv:: f (международный аргумент) могло быть невиртуальным также; ошибка происходит в так или иначе
    - ошибка исчезает/может обойтись...
      ... путем кастинга Deriv возражают против Базового класса
      ... если не переопределение Основы:: f (международный аргумент) в Deriv
      ... путем добавления команды "Base:: f"; к общедоступной части Deriv

Так, так как я уже знаю, как избежать этой ошибки компиляции, я главным образом интересуюсь тем, почему эта ошибка происходит! Помогите мне пролить свет на это...

Спасибо в advanvce! emme

7
задан Emme 4 August 2010 в 14:26
поделиться

2 ответа

В Deriv добавьте следующее:

using Base::f;

В дополнение к ссылке, предоставленной @DumbCoder, вы можете найти более подробную информацию в моем ответе на аналогичный вопрос: Переопределение перегруженной функции базы в C ++

8
ответ дан 7 December 2019 в 01:15
поделиться

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

2
ответ дан 7 December 2019 в 01:15
поделиться
Другие вопросы по тегам:

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