Они пришли из Java и были введены потому, что Java (и C #) не допускают множественного наследования.
РЕДАКТИРОВАТЬ: Я получаю некоторые downmods, потому что люди, использующие интерфейсы COM в C ++, не согласны с приведенным выше утверждением. Несмотря на это, концепция интерфейса возникла из java, COM-интерфейсы C ++ были виртуальными классами, java был первым языком, сделавшим его языковой функцией.
КОНЕЦ РЕДАКТИРОВАНИЯ
Например, в C ++ у вас может быть класс с именем Dog, унаследованный от Animal и Mammal.
В C # у вас будет базовый класс с именем Animal, и вы будете использовать интерфейс (IMammal). Обозначение именования I является историческим из C ++ (оно использовалось для обозначения абстрактного виртуального класса) и было перенесено в Java, но более важно в C #, потому что нет простого способа определить, что такое базовый класс и что интерфейс из объявления класса C #:
public class Dog : Animal, IMammal
в то время как в Java это было более очевидно:
public class Dog extends Animal implements IMammal
Множественное наследование очень сложно, поэтому были созданы интерфейсы для его упрощения. Класс C # может наследоваться только от одного базового класса, но может реализовывать N интерфейсов.
В C ++ интерфейсы можно моделировать с использованием чисто виртуальных классов. Они требуют, чтобы все методы были переопределены полиморфно наследующим классом.