ключ решения - это ключевое слово virtual .
Спецификатор virtual указывает, что нестатическая c функция-член является виртуальной и поддерживает отправку Dynami c. Он может появляться только в декларативном-спецификаторе-seq начального объявления нестатической c функции-члена (т. Е. Когда он объявлен в определении класса).
См. это для why do we need virtual functions?
. С «виртуальным» мы получаем «позднее связывание». Выбор реализации метода определяется во время выполнения в зависимости от типа объекта, на который указывает объект, - от того, как он был изначально создан (а не от типа указателя, через который вы вызываете!).
Если вам нужна такая «поздняя привязка» и вы хотите вызвать правильный метод ( store ) во время выполнения независимо от типа указателя, который вы используете для вызова store () , затем go вперед с виртуальными функциями со следующей реализацией:
Попробуйте следующее:
class MovieRepo {
public:
// ....
virtual void store(const Movie& m);
}
class RepoFile: public MovieRepo {
public:
void store(const Movie& m) override
{
// ....
}
}
Подробнее о предупреждении / ошибке компиляции:
Ключевое слово override служит двум целям:
- Оно показывает читателю кода, что «это виртуальный метод, который заменяет виртуальный метод базового класса».
- Компилятор также знает, что это переопределение, поэтому он может «проверить», что вы не изменяете / не добавляете новые методы, которые, по вашему мнению, являются переопределениями.
В вашем случае компилятор предупреждает вас, что метод ваша виртуальная функция (в классе RepoFile
) не отменяет никакую виртуальную функцию в базовом классе.