Ключевое
Абстрактный базовый класс в 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;
}
Преимущества:
- Интерфейс: Позволяет определять чёткий интерфейс для производных классов.
- Полиморфизм: Обеспечивает возможность использования указателей и ссылок на базовый класс для вызова методов производных классов.
- Инкапсуляция: Скрывает детали реализации, требуя только реализации интерфейса в производных классах.
Замечание:
- Абстрактные базовые классы могут содержать как чисто виртуальные функции, так и обычные виртуальные и невиртуальные функции.
- Класс с хотя бы одной чисто виртуальной функцией считается абстрактным и не может быть инстанциирован напрямую.