Я сделал удар для C ++. Я закончил тем, что работает, но это макро-цирк: https://github.com/wkaras/c-plus-plus-misc/tree/master/IFACE. Интерфейс - это два указателя, один для объекта-члена данных, а другой - для эквивалента виртуальной таблицы (структура указателей на функции thunk, которые вызывают функции-члены). Эти таблицы (к сожалению) создаются во время выполнения. Преобразование из интерфейса в подчиненный интерфейс требует поиска unordered_map, так что в среднем это O (1) сложность по времени. По сравнению с преобразованием указателя / ссылки производного класса в базовый класс, который является O (1) наихудшим случаем.
Это не очень удобно, но показывает, что интерфейсы могут быть (чисто) добавлены в C ++ с относительно небольшими усилиями. Есть случаи, когда интерфейсы лучше, чем ОО на основе наследования, и корова старается изо всех сил стараться поддерживать C ++ маленьким.