Тут, на самом деле, необходимо чётко определить границы.
Есть ООП как парадигма программирования. Одна из концепций ООП называется полиморфизм. Существуют различные реализации этой концепции в языках программирования.
В C++ есть несколько реализаций полиморфизма. Вам, на данном этапе, скорее всего интересен только полиморфизм, основанный на подтипах. Это означает, что вызывающий код может работать с набором типов из определённой иерархии, без знания о том, какой это конкретно но тип: базовый или подтип.
Касательно интерфейсов: в C++ их нет на уровне языка, как отдельной сущности. Однако же разница между интерфейсом и абстрактным классом никуда не делась.
Пример "обычного полиморфизма":
// Это "интерфейс", который представляет собой набор операций, которые можно произвести над объектом
// В данном случае, по объекту можно постучать
class IKnockable {
public:
virtual ~IKnockable() = 0;
// Само по себе действие: "постучать"
virtual void knock() const = 0;
};
// Реализация интерфейса классом Door
class Door : public IKnockable {
public:
// ...
void knock() const override { std::cout << "door" << std::endl; }
// ...
};
// Реализация интерфейса классом Window
class Window : public IKnockable {
public:
// ...
void knock() const override { std::cout << "window" << std::endl; }
// ...
};
// ...
// Какая-то функция, которая может постучать по каждому объекту из списка,
// не имея представления о том, что же это за объект
void knock(const std::vector<std::shared_ptr<IKnockable>> &knockableObjects) {
for (auto &&knockableObject : knockableObjects) {
knockableObject->knock();
}
}
// ...
std::vector<std::shared_ptr<IKnockable>> v = {std::make_shared<Door>(), std::make_shared<Window>()};
knock(v); // Сначала напечатает "door", потом напечатает "window"
Ответ на ваш изначальный вопрос: это понятия из разных областей, одно из теории типов, другое из языков программирования. Интерфейс -- это одно из средств в языках программирования, для реализации определённого типа полиморфизма.