Я пытаюсь наследовать два метода с одинаковыми именами с различными списками параметров для производного класса. Один из них является виртуальным и переопределен в производном классе, другой - не виртуальный. При этом я получаю ошибку компиляции при попытке получить доступ к не виртуальному методу базового класса из объекта производного класса.
Вот фрагмент кода
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