Назад к вопросам
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;
}