HatunaLM
@HatunaLM

В чем отличие полиморфизма от реализации интерфейса?

Привет всем. Скажите, пожалуйста, в чем отличие реализации интерфейса от полиморфизма в С++? Т.е. я понимаю, что в интерфейсе все методы чисто виртуальные, а при полиморфизме базовый класс может иметь и другие методы, т.е. не чисто виртуальные. Т.е. получается, что отличие лишь в этом? Вопрос может показаться не особо "умным", но боюсь что-то упустить. Спасибо.
  • Вопрос задан
  • 1485 просмотров
Решения вопроса 1
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Тут, на самом деле, необходимо чётко определить границы.

Есть ООП как парадигма программирования. Одна из концепций ООП называется полиморфизм. Существуют различные реализации этой концепции в языках программирования.

В 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"


Ответ на ваш изначальный вопрос: это понятия из разных областей, одно из теории типов, другое из языков программирования. Интерфейс -- это одно из средств в языках программирования, для реализации определённого типа полиморфизма.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
Полиморфизм - это создание дочерних классов, каждый из которых является разновидностью базового.
Реализация интерфейса всего лишь означает, что класс умеет давать ответы на некоторый набор вопросов. При этом являться он может быть чем угодно.

Например, класс офисной мебели может иметь подклассы - стулья и столы, каждый из которых является мебелью. При этом любой предмет в офисе должен реализовать интерфейс инвентаризации - выдавать свой инвентарный номер, чем бы он ни являлся.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы