Помимо ошибок в вашем коде, это пример сокрытия : ваш производный класс объявляет функцию с тем же именем , но с другой сигнатурой в качестве базового класса. Таким образом, базовая функция скрыта :
class A { virtual void foo(); };
class B : public A { virtual void foo(int); /* hides A::foo() ! */ };
Наследование влияет только на функции с одинаковой сигнатурой (с некоторыми незначительными исключениями).
Ваша функция базового класса объявлена как void Parent<N>::operator()(int)
, тогда как в вашем производном классе вы объявляете void Child::operator()()
.
В C ++ 11 вы можете явно сказать virtual void foo(int) override
, чтобы вызвать ошибку компилятора, если функция ничего не переопределяет.
Если вы намеренно хотите определить новую функцию с тем же именем, что и существующая, но с другой сигнатурой, но не переопределяя базовую функцию, тогда вы можете сделать базовую функцию видимой с помощью директивы using
:
class C : public A
{
using A::foo();
void foo(int);
}; // now have both C::foo(int) and C::foo()