Если вы объявляете функцию с тем же именем в производном классе, она скрывает все функции с тем же именем в базовом классе.
Так что просто добавьте:
string year () const;
Чтобы ваш производный класс снова скрывал функцию базового класса.
Обратите внимание, что эта функция скрывает, а не переопределяет.Для переопределения вам нужно, чтобы функция была объявлена как виртуальная в вашем базовом классе.И это то, о чем просит Q:
Ваш базовый класс должен иметь:
virtual string year () const;
Далее вы объявляете его в своем производном классе, а затем определяете его соответствующим образом.
Частное наследование не очень хорошая идея, потому что здесь,
При частном наследовании все члены базового класса становятся частными членами производного класса.
Приведенное выше правило будет означать, что вы не можете вызывать (для объекта класса Derived) ни один из методов, которые имеют реализацию только в базовом классе, и ни одного в классе Derived, это не то, что вы пытаетесь реализовать, я думаю.