Назад к вопросам
Junior
93
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Абстрактный класс — это класс, который нельзя инстанцировать напрямую. Он содержит один или более чисто виртуальных методов (методы без реализации), помеченных = 0. Используется как базовый класс для определения общего интерфейса для производных классов, которые обязаны предоставить реализацию этих чисто виртуальных методов.

Основные свойства:

  • Нельзя создать объект абстрактного класса: AbstractClass obj; — ошибка.
  • Может содержать обычные (не виртуальные) методы и поля данных.
  • Может содержать виртуальные методы с реализацией и чисто виртуальные методы.
  • На него могут ссылаться указатели или ссылки базового типа: AbstractClass* ptr = new DerivedClass();
  • Производные классы, не реализующие все чисто виртуальные методы базового класса, также становятся абстрактными.

Пример использования для определения контракта:

// Абстрактный базовый класс Shape
class Shape {
public:
    // Чисто виртуальный метод - каждый наследник должен его реализовать
    virtual double area() const = 0;
    // Виртуальный метод с реализацией
    virtual void printDescription() const {
        // Описание по умолчанию
    }
    // Не виртуальный метод
    void commonOperation() {
        // Общие действия
    }
    // Виртуальный деструктор важен для правильного освобождения памяти при работе через указатели/ссылки на базовый класс.
    virtual ~Shape() {}
};

// Производный класс, реализующий абстрактный метод
class Circle : public Shape {
private:
    double radius;
public:
    Circle(double r) : radius(r) {}
    // Реализация чисто виртуального метода area()
    double area() const override {
        return 3.14159 * radius * radius;
    }
    // Переопределение виртуального метода
    void printDescription() const override {
        // Описание для круга
    }
    // Деструктор
    ~Circle() override {}
};

// Другой производный класс
class Rectangle : public Shape {
private:
    double width, height;
public:
    Rectangle(double w, double h) : width(w), height(h) {}
    // Реализация чисто виртуального метода area()
    double area() const override {
        return width * height;
    }
    // Деструктор
    ~Rectangle() override {}
};

// Пример использования
int main() {
    //Shape s; // Ошибка: нельзя создать объект абстрактного класса

    Shape* shapes[2]; // Указатели на базовый класс
    shapes[0] = new Circle(5.0);
    shapes[1] = new Rectangle(4.0, 6.0);

    for(int i = 0; i < 2; ++i) {
        // Полиморфный вызов метода area()
        double a = shapes[i]->area();
        // Полиморфный вызов метода printDescription()
        shapes[i]->printDescription();
        shapes[i]->commonOperation(); // Вызов не виртуального метода
    }

    // Корректное освобождение памяти через базовые указатели
    delete shapes[0];
    delete shapes[1];

    return 0;
}