В соответствии со спецификацией C ++, да.
Вам необходимо объявить виртуальный деструктор, потому что в противном случае позже
IMyInterface * ptr = getARealOne();
delete ptr;
не вызовет деструктор в производном классе (потому чтодеструктор отсутствует в VTable)
Он должен быть не чистым, потому что деструктор базового класса всегда вызывается деструктором подкласса.
Для дальнейшего объяснения, C ++ не имеетконцепция интерфейса точно так же, как в Java или C #.Это просто соглашение использовать только чисто виртуальные методы и воспринимать это как интерфейс.Из-за других правил, касающихся деструкторов C ++, он должен быть не чистым, что нарушает сходство с интерфейсами в других языках, но эти языки не существовали на момент создания этих правил.