Виртуальные функции в C++: объявление, переопределение и многое другое

В C++ виртуальная функция — это функция-член, объявленная в базовом классе и предназначенная для переопределения производными классами. Он позволяет динамическую привязку вызова функции во время выполнения, обеспечивая полиморфное поведение.

Вот несколько методов, связанных с виртуальными функциями в C++:

  1. Объявление виртуальной функции. Чтобы объявить виртуальную функцию, вы используете ключевое слово virtualв объявлении функции в базовом классе. Например:

    class Base {
    public:
    virtual void virtualFunction() {
        // Function implementation
    }
    };
  2. Переопределение виртуальной функции. Чтобы переопределить виртуальную функцию в производном классе, вы используете ту же сигнатуру функции и ключевое слово override. Например:

    class Derived : public Base {
    public:
    void virtualFunction() override {
        // Overridden function implementation
    }
    };
  3. Виртуальные деструкторы. Если у вас есть базовый класс с виртуальными функциями, рекомендуется объявить виртуальный деструктор. Это гарантирует, что деструктор производного класса вызывается правильно при удалении объекта производного класса через указатель на базовый класс. Например:

    class Base {
    public:
    virtual ~Base() {
        // Destructor implementation
    }
    };
  4. Чистые виртуальные функции. Чисто виртуальная функция — это виртуальная функция, которая объявлена ​​в базовом классе, но не имеет реализации. Он должен быть переопределен производными классами. Базовый класс становится абстрактным классом, и объекты базового класса не могут быть созданы. Например:

    class AbstractBase {
    public:
    virtual void pureVirtualFunction() = 0; // Pure virtual function
    };
  5. Вызов виртуальной функции: когда вы вызываете виртуальную функцию через указатель или ссылку базового класса, выполняемая функция зависит от фактического типа объекта. Это известно как динамическая отправка или позднее связывание. Например:

    Base* ptr = new Derived();
    ptr->virtualFunction(); // Calls the overridden function in Derived