Ключевое

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


Определение:

  • Абстрактный класс в C++ это класс, который содержит хотя бы одну чисто виртуальную функцию.
  • Чисто виртуальная функция это функция, у которой отсутствует реализация в базовом классе, и её необходимо переопределить в производных классах.
class AbstractBase {
public:
    virtual void pureVirtualFunction() = 0; // Чисто виртуальная функция
    virtual void normalFunction() {
        std::cout << "AbstractBase normalFunction()" << std::endl;
    }
    virtual ~AbstractBase() {} // Виртуальный деструктор
};

Использование:

  • Абстрактные базовые классы используются для определения интерфейсов, которые должны быть реализованы в производных классах.
  • Нельзя создать объект абстрактного класса, только указатели и ссылки на него.
class ConcreteDerived : public AbstractBase {
public:
    void pureVirtualFunction() override {
        std::cout << "ConcreteDerived pureVirtualFunction()" << std::endl;
    }
};
 
int main() {
    // AbstractBase base; // Ошибка компиляции: нельзя создать объект абстрактного класса
    ConcreteDerived derivedObj;
    AbstractBase* basePtr = &derivedObj;
 
    basePtr->pureVirtualFunction(); // Вывод: ConcreteDerived pureVirtualFunction()
    basePtr->normalFunction();      // Вывод: AbstractBase normalFunction()
 
    return 0;
}

Преимущества:

  • Интерфейс: Позволяет определять чёткий интерфейс для производных классов.
  • Полиморфизм: Обеспечивает возможность использования указателей и ссылок на базовый класс для вызова методов производных классов.
  • Инкапсуляция: Скрывает детали реализации, требуя только реализации интерфейса в производных классах.

Замечание:

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