Проблема, с которой вы сталкиваетесь, ортогональна чисто виртуальным функциям и связана с тем, как C ++ выполняет разрешение имен в иерархиях классов.
Когда вы пишете
obj.f();
C ++ пытаетсяискать функцию с именем f
, чтобы она знала, что вызывать.Поскольку obj
имеет тип Derived
, он начинается внутри Derived
и ищет функцию с именем f
.В итоге он находит Derived::f(int)
, и хотя эта функция принимает аргумент, C ++ считает, что это метод, который вы пытаетесь вызвать, и поэтому перестает искать.Затем компилятор замечает, что вы пытаетесь вызвать его без параметров, и выдает ошибку о вызове функции.
Чтобы это исправить, вы должны сообщить компилятору C ++, что он также должен попытаться найтифункция Base::f()
, которая содержится в базовом классе.Для этого вы можете изменить определение Derived
следующим образом:
class Derived : public Base
{
public:
int f(int i)
{
return (10 + i);
}
using Base::f;
};
Эта строка using Base::f
говорит C ++, что она должна обрабатывать функции в Base
с именем f
, как будто они являются частьюDerived
.Таким образом, когда компилятор пытается найти функцию с именем f
, он находит и Derived::f(int)
, и Base::f()
.Вызов тогда будет успешным, потому что компилятор может выяснить, что вы пытаетесь вызвать Base::f()
с кодом, который вы перечислили.
Надеюсь, это поможет!