Не думай об этом на уровне класса.
Посмотрите на метод и подумайте, что он должен делать в случае по умолчанию:
virtual std::string getName() const = 0;
Какая будет правильная реализация для этого метода? Нет никого, о чем я могу думать.
Помечая его как «чисто виртуальный», вы гарантируете, что если пользователь когда-либо получит экземпляр класса, производный от вашего интерфейса, то этот метод будет иметь разумное поведение.
Единственный другой способ сделать это - это тело throw NotImplemented("getName");
, но тогда вы обнаружите проблему во время выполнения, а не во время компиляции, что не так приятно:)