Я пытаюсь наследовать два одинаково именованных метода с различными списками параметров к производному классу. Один из них является виртуальным и переопределяется в производном классе, другой является невиртуальным. Делая так, я получаю ошибку компиляции при попытке получить доступ к невиртуальному методу базового класса от объекта производного класса.
Вот фрагмент кода
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 () не должен быть переопределен и должен остаться доступным. Я неправильно с этим?
Вот некоторые интересные/дополнительные комментарии что:
Так, так как я уже знаю, как избежать этой ошибки компиляции, я главным образом интересуюсь тем, почему эта ошибка происходит! Помогите мне пролить свет на это...
Спасибо в advanvce! emme
В Deriv
добавьте следующее:
using Base::f;
В дополнение к ссылке, предоставленной @DumbCoder, вы можете найти более подробную информацию в моем ответе на аналогичный вопрос: Переопределение перегруженной функции базы в C ++
Функция производного класса скрывает определение базовой функции. Подробное объяснение того, почему и как