Абстрактный класс
Абстрактный класс - это класс, который содержит хотя бы одну чисто виртуальную функцию. Такой класс нельзя использовать для создания объектов напрямую, он служит базой для других классов. Производные классы обязаны переопределить все чисто виртуальные функции базового класса, иначе они тоже станут абстрактными. Чистая виртуальная функция объявляется с помощью спецификатора = 0 после сигнатуры.
Синтаксис
class Base
{
public:
virtual void func() = 0;
};
class Derived : public Base
{
public:
void func() override
{
// реализация
}
};
Пример
Давайте создадим абстрактный класс Shape с чисто виртуальной функцией area и два производных класса Circle и Rectangle, которые реализуют эту функцию:
#include <iostream>
using namespace std;
class Shape
{
public:
virtual double area() = 0;
virtual ~Shape() {}
};
class Circle : public Shape
{
private:
double radius;
public:
Circle(double r) : radius(r) {}
double area() override
{
return 3.14 * radius * radius;
}
};
class Rectangle : public Shape
{
private:
double width;
double height;
public:
Rectangle(double w, double h) : width(w), height(h) {}
double area() override
{
return width * height;
}
};
int main()
{
Circle c(5);
Rectangle r(4, 6);
cout << c.area() << endl;
cout << r.area() << endl;
return 0;
}
Результат выполнения кода:
78.5
24
Пример
Абстрактные классы удобно использовать через указатели и ссылки на базовый тип. Давайте создадим массив указателей на Shape и вызовем функцию area для каждого объекта:
#include <iostream>
using namespace std;
class Shape
{
public:
virtual double area() = 0;
virtual ~Shape() {}
};
class Circle : public Shape
{
private:
double radius;
public:
Circle(double r) : radius(r) {}
double area() override
{
return 3.14 * radius * radius;
}
};
class Rectangle : public Shape
{
private:
double width;
double height;
public:
Rectangle(double w, double h) : width(w), height(h) {}
double area() override
{
return width * height;
}
};
int main()
{
Shape* shapes[2];
shapes[0] = new Circle(5);
shapes[1] = new Rectangle(4, 6);
for (int i = 0; i < 2; i++)
{
cout << shapes[i]->area() << endl;
}
delete shapes[0];
delete shapes[1];
return 0;
}
Результат выполнения кода:
78.5
24
Смотрите также
-
ключевое слово
virtual,
которое объявляет виртуальную функцию -
спецификатор
pure-virtual,
который создает чисто виртуальную функцию -
спецификатор
override,
который проверяет переопределение функции -
спецификатор
final,
который запрещает наследование класса