← Назад ко всем вопросам

Есть ли в C++ интерфейс

1️⃣ Как кратко ответить

В C++ нет интерфейсов как отдельной сущности, как в Java или C#. Однако интерфейсы можно реализовать с помощью абстрактных классов, содержащих только чисто виртуальные функции.

2️⃣ Подробное объяснение темы

В C++ интерфейсы реализуются через абстрактные классы. Абстрактный класс — это класс, содержащий хотя бы одну чисто виртуальную функцию. Чисто виртуальная функция — это функция, объявленная с помощью оператора = 0. Такие классы не могут быть инстанцированы напрямую и служат для определения интерфейса, который должны реализовать производные классы.

Пример реализации интерфейса в C++

#include <iostream>
​
// Абстрактный класс, представляющий интерфейс
class IShape {
public:
    // Чисто виртуальная функция для вычисления площади
    virtual double area() const = 0;
​
    // Чисто виртуальная функция для вычисления периметра
    virtual double perimeter() const = 0;
​
    // Виртуальный деструктор
    virtual ~IShape() {}
};
​
// Класс Circle, реализующий интерфейс IShape
class Circle : public IShape {
private:
    double radius;
​
public:
    // Конструктор для инициализации радиуса
    Circle(double r) : radius(r) {}
​
    // Реализация функции для вычисления площади
    double area() const override {
        return 3.14159 * radius * radius;
    }
​
    // Реализация функции для вычисления периметра
    double perimeter() const override {
        return 2 * 3.14159 * radius;
    }
};
​
// Класс Rectangle, реализующий интерфейс IShape
class Rectangle : public IShape {
private:
    double width, height;
​
public:
    // Конструктор для инициализации ширины и высоты
    Rectangle(double w, double h) : width(w), height(h) {}
​
    // Реализация функции для вычисления площади
    double area() const override {
        return width * height;
    }
​
    // Реализация функции для вычисления периметра
    double perimeter() const override {
        return 2 * (width + height);
    }
};
​
int main() {
    // Создание объектов Circle и Rectangle
    IShape* circle = new Circle(5.0);
    IShape* rectangle = new Rectangle(4.0, 6.0);
​
    // Вывод площади и периметра для каждого объекта
    std::cout << "Circle area: " << circle->area() << std::endl;
    std::cout << "Circle perimeter: " << circle->perimeter() << std::endl;
    std::cout << "Rectangle area: " << rectangle->area() << std::endl;
    std::cout << "Rectangle perimeter: " << rectangle->perimeter() << std::endl;
​
    // Освобождение памяти
    delete circle;
    delete rectangle;
​
    return 0;
}

Объяснение кода

  1. Абстрактный класс IShape:

    • Содержит две чисто виртуальные функции area() и perimeter(), которые должны быть реализованы в производных классах.
    • Виртуальный деструктор необходим для корректного освобождения ресурсов при удалении объектов через указатель на базовый класс.
  2. Класс Circle:

    • Реализует интерфейс IShape.
    • Содержит конструктор для инициализации радиуса.
    • Реализует функции area() и perimeter() для вычисления площади и периметра круга.
  3. Класс Rectangle:

    • Также реализует интерфейс IShape.
    • Содержит конструктор для инициализации ширины и высоты.
    • Реализует функции area() и perimeter() для вычисления площади и периметра прямоугольника.
  4. Функция main():

    • Создает объекты Circle и Rectangle через указатели на IShape.
    • Вызывает методы area() и perimeter() для каждого объекта.
    • Освобождает память, выделенную под объекты.

Таким образом, в C++ интерфейсы реализуются через абстрактные классы, что позволяет создавать гибкие и расширяемые архитектуры программ.

Тема: Классы / ООП / Полиморфизм
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки