... > C++ > Виртуальные функции и...

Виртуальные функции и абстрактные классы в 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), что позволяет вызывать методы производных классов через указатель на базовый класс.

  • Абстрактные классы и виртуальные функции являются ключевыми инструментами в объектно-ориентированном программировании (ООП) для создания гибких иерархий классов.