Что такое абстрактный класс в C++?

«Что такое абстрактный класс в C++?» — вопрос из категории ООП, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Пример:

// Абстрактный класс, представляющий геометрическую фигуру
class Shape {
public:
    // Чистая виртуальная функция делает класс абстрактным
    virtual double calculateArea() const = 0;

    // Виртуальный деструктор - обязателен для полиморфных базовых классов
    virtual ~Shape() = default;

    // Невиртуальный метод - общая реализация для всех фигур
    void printDescription() const {
        std::cout << "Area is: " << calculateArea() << std::endl;
    }
};

// Конкретный класс, реализующий абстрактный интерфейс
class Circle : public Shape {
    double radius;
public:
    Circle(double r) : radius(r) {}

    // Обязательная реализация чистой виртуальной функции
    double calculateArea() const override {
        return 3.14159 * radius * radius;
    }
};

// Shape s; // Ошибка компиляции: нельзя создать объект абстрактного класса
Circle c(5.0); // OK
c.printDescription(); // Работает, вызовет calculateArea() для Circle

Зачем это нужно:

  • Принудительное определение интерфейса: Гарантирует, что все производные классы реализуют ключевые методы.
  • Полиморфизм: Указатели или ссылки на базовый абстрактный класс Shape* могут использоваться для работы с любыми производными объектами (Circle, Square).
  • Запрет инстанцирования: Логически некорректно создавать объект "просто фигуры", должна быть конкретная фигура.