Что такое интерфейс в общем понимании
Что проверяют
Отделяете ли вы понятие контракта от конкретного синтаксиса. Ключевого слова для интерфейса в C++ нет, поэтому вопрос проверяет, понимаете ли вы, что интерфейс это соглашение о допустимых операциях, а выразить его в языке можно несколькими способами.
Как отвечать
В общем виде интерфейс это набор операций вместе с правилами их применения: предусловия, гарантии, владение и время жизни. Он нужен, чтобы вызывающий код зависел от контракта, а не от конкретной реализации.
В C++ контракт выражают двумя способами. Динамический это абстрактный базовый класс с чисто виртуальными функциями, без полей и без состояния.
class Serializer {
public:
virtual ~Serializer() = default;
virtual std::string encode(const Record& rec) const = 0;
};Платой идут косвенный вызов через таблицу виртуальных функций и обязательная работа через указатель или ссылку.
Статический это шаблон с ограничением через концепт: контракт проверяется при компиляции, вызов прямой и доступен для подстановки, но код размножается по инстанцированиям, а диагностика читается хуже.
Выбор понятный. Набор реализаций известен при сборке и важна скорость: берём концепт. Реализация подставляется в рантайме, скажем подменяется в тестах или приходит из модуля: берём абстрактный класс.
Где спотыкаются
Забывают виртуальный деструктор в базе и удаляют объект через указатель на неё. Поведение не определено, ресурсы наследника не освобождаются. Если удаление через базу не предполагается, деструктор делают защищённым и невиртуальным, это тоже рабочий ответ.
Передают объект по значению и получают срезку: копируется только базовая часть, виртуальное поведение теряется молча. Работать с интерфейсом можно лишь через ссылку или умный указатель.
Складывают в интерфейс поля и готовые реализации, превращая его в базовый класс с состоянием. Дальше любая правка базы задевает всех наследников, и весь смысл отделения контракта от реализации пропадает.