Виртуальные функции и абстрактные классы в C++
НАВИГАЦИЯ ПО СТРАНИЦЕ
Виртуальные функции и абстрактные классы в C++ используются для создания полиморфных иерархий классов, позволяя более гибко работать с объектами различных типов в рамках общего интерфейса. Давайте рассмотрим эти концепции более подробно:
Виртуальные функции :
Виртуальные функции позволяют переопределять методы в производных классах, обеспечивая динамическую диспетчеризацию (возможность выбора правильного метода во время выполнения).
#include <iostream>
class Base {
public:
// Виртуальная функция
virtual void display() {
std::cout << "Base class\n";
}
};
class Derived : public Base {
public:
// Переопределение виртуальной функции
void display() override {
std::cout << "Derived class\n";
}
};
int main() {
Base baseObj;
Derived derivedObj;
// Вызов виртуальной функции
baseObj.display(); // "Base class"
derivedObj.display(); // "Derived class"
// Пример полиморфизма
Base* ptr = &derivedObj;
ptr->display(); // "Derived class"
return 0;
}
Абстрактные классы и чисто виртуальные функции:
Абстрактные классы содержат чисто виртуальные функции, которые не имеют реализации в самом классе. Они используются для создания интерфейсов, где производные классы обязаны предоставить свои реализации.
#include <iostream>
// Абстрактный класс с чисто виртуальной функцией
class Shape {
public:
virtual void draw() const = 0; // Чисто виртуальная функция
virtual double area() const = 0; // Еще одна чисто виртуальная функция
};
// Производный класс
class Circle : public Shape {
public:
void draw() const override {
std::cout << "Drawing a circle\n";
}
double area() const override {
return 3.14; // Просто для примера
}
};
int main() {
// Нельзя создать экземпляр абстрактного класса
// Shape shape; // Ошибка компиляции
Circle circle;
circle.draw(); // "Drawing a circle"
std::cout << "Area: " << circle.area() << "\n";
// Использование указателя на абстрактный класс
Shape* shapePtr = &circle;
shapePtr->draw(); // "Drawing a circle"
return 0;
}
Важные моменты :
Чисто виртуальные функции создают абстрактные классы, и объекты таких классов не могут быть созданы. Они могут использоваться только через указатели или ссылки.
Если класс содержит хотя бы одну чисто виртуальную функцию, он становится абстрактным, и нельзя создать его экземпляр.
Виртуальные функции обеспечивают динамическое связывание (runtime polymorphism), что позволяет вызывать методы производных классов через указатель на базовый класс.
Абстрактные классы и виртуальные функции являются ключевыми инструментами в объектно-ориентированном программировании (ООП) для создания гибких иерархий классов.