Ключевое

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


Виртуальная функция — это метод, который объявляется с ключевым словом virtual в базовом классе и может быть переопределен в производных классах.

Основные моменты

  • Виртуальная функция объявляется в базовом классе с ключевым словом virtual.
  • Переопределение в производном классе осуществляется с тем же сигнатурой и с возможностью использования ключевого слова override для явного указания на переопределение.
  • Виртуальная таблица (vtable) используется для обеспечения динамического полиморфизма.

Пример

#include <iostream>
 
class Base {
public:
    virtual void show() {
        std::cout << "Base class show() method" << std::endl;
    }
 
    virtual ~Base() {} // Виртуальный деструктор
};
 
class Derived : public Base {
public:
    void show() override {
        std::cout << "Derived class show() method" << std::endl;
    }
};
 
void display(Base& obj) {
    obj.show(); // Вызывает метод show() в зависимости от типа объекта
}
 
int main() {
    Base baseObj;
    Derived derivedObj;
 
    display(baseObj);      // Вывод: Base class show() method
    display(derivedObj);   // Вывод: Derived class show() method
 
    return 0;
}

Деструкторы:

  • Деструкторы в базовых классах должны быть виртуальными, чтобы гарантировать правильный вызов деструкторов производных классов при удалении объекта через указатель на базовый класс.
class Base {
public:
    virtual ~Base() {
        std::cout << "Base destructor" << std::endl;
    }
};
 
class Derived : public Base {
public:
    ~Derived() {
        std::cout << "Derived destructor" << std::endl;
    }
};
 
int main() {
    Base* obj = new Derived();
    delete obj; // Вывод: Derived destructor, затем Base destructor
    return 0;
}

Правила:

  • Ключевое слово virtual используется только в объявлении метода базового класса.
  • Ключевое слово override (не обязательно, но рекомендуется) используется в объявлении метода производного класса для явного указания на переопределение виртуального метода.

Полиморфизм:

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