---
title: Виртуальные функции и деструкторы
seo:
  title: Виртуальные функции и деструкторы — C++ Developer
  description: Тема «Виртуальные функции и деструкторы» для собеседования C++ Developer. Что делает ключевое слово virtual? Может ли деструктор быть виртуальным?
---

[Все темы C++ Developer](/c-developer)

## <strong>Что делает ключевое слово</strong> <code>virtual</code><strong>?</strong> [#q-14bee738d69b8193a468f3b8931489f0]

Ключевое слово <code>virtual</code> в C++ используется для создания виртуальных функций, которые могут быть переопределены в производных классах, обеспечивая полиморфизм.

<code>virtual</code> позволяет динамически определять, какую версию функции
вызывать, основываясь на типе объекта, на который указывает указатель или
ссылка.

<strong>Пример&#58;</strong>

```cpp
class Base {
public:
    virtual void display() {
        std::cout << "Base display" << std::endl;
    }
};

class Derived : public Base {
public:
    void display() override {
        std::cout << "Derived display" << std::endl;
    }
};

Base* obj = new Derived();
obj->display();  // Вызывает Derived::display() благодаря virtual
```

:::note[Ссылки для изучения]

1. [Виртуальные функции и их переопределение](https://metanit.com/cpp/tutorial/5.11.php)
   :::

---

## <strong>Может ли деструктор быть виртуальным?</strong> [#q-14bee738d69b81758988d87106d33f5f]

<strong>Да</strong>, деструктор может быть виртуальным. Это необходимо для
корректного освобождения ресурсов при удалении объекта через указатель на
базовый класс.

<strong>Пример&#58;</strong>

```cpp
class Base {
public:
    virtual ~Base() {
        // Деструктор базового класса
    }
};

class Derived : public Base {
public:
    ~Derived() {
        // Деструктор производного класса
    }
};

Base* obj = new Derived();
delete obj;  // Вызывает корректные деструкторы благодаря virtual
```

Использование виртуального деструктора гарантирует, что при удалении объекта через указатель на базовый класс будут вызваны деструкторы как базового, так и производного классов.

:::note[Ссылки для изучения]

1. [Виртуальные функции и их переопределение](https://metanit.com/cpp/tutorial/5.11.php)
   :::
