C ++: наследование перегруженного не виртуального метода и виртуального метода с одинаковыми именами вызывает проблемы - PullRequest
6 голосов
/ 04 августа 2010

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

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

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 (int)

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

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

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

Спасибо за преимущество! emme

Ответы [ 2 ]

8 голосов
/ 04 августа 2010

В Deriv, добавьте:

using Base::f;

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

2 голосов
/ 04 августа 2010

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

...