Перейти к основному содержимому

Абстрактные классы

Виртуальная функция называется чистой, если она определена только для спецификации интерфейса класса. Чисто виртуальные функции не имеют реализации и определяются следующим образом:

virtual тип имя_функции(параметры) = 0;

Предполагается, что чистая виртуальная функция переопределяется в производных классах. Класс, который содержит хотя бы одну чисто виртуальную функцию, называется абстрактным классом.

Так как у чисто виртуальных функций отсутствует реализация, то невозможно создать объект, принадлежащий абстрактному классу. Поэтому абстрактный класс может использоваться только в качестве базового класса для других классов.

Однако можно определить указатель или ссылку на абстрактный класс. Это позволяет использовать абстрактные классы для описания интерфейсов базовых классов и работы с производными классами через указатели или ссылки на базовый класс.

Если класс, производный от абстрактного класса, не определяет все чисто виртуальные функции, то он также является абстрактным классом. Пример использования ссылки на абстрактный класс в качестве параметра функции:

#include <iostream>

class Abstract {
public:
virtual ~Abstract() {}
virtual int what() = 0;
};

class Concrete : public Abstract {
public:
virtual ~Concrete() {}
virtual int what() { return 10; }
};

int foo(Abstract& a) { return a.what(); }

int main() {
Concrete c;
std::cout << foo(c) << std::endl; // печатает 10
return 0;
}