Назад к вопросам
Middle+
172
questionbank

Что такое таблица виртуальных методов?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Таблица виртуальных методов (vtable, virtual method table, virtual function table) — это механизм, используемый в C++ (и других объектно-ориентированных языках) для реализации полиморфизма во время выполнения (динамической диспетчеризации).

  • Это таблица указателей на виртуальные функции класса.
  • Каждый объект с хотя бы одной виртуальной функцией или наследованный от класса с виртуальными функциями содержит скрытый указатель (vptr), который указывает на таблицу виртуальных методов своего класса.
  • При вызове виртуальной функции через указатель или ссылку на базовый класс, vptr используется для определения фактического типа объекта и, следовательно, для нахождения соответствующего указателя на функцию в таблице виртуальных методов для вызова правильной реализации функции.
class Base {
public:
    virtual void show() { // Виртуальная функция
        // Реализация в базовом классе
    }
    virtual void print() { // Другая виртуальная функция
        // Реализация в базовом классе
    }
};

class Derived : public Base {
public:
    void show() override { // Переопределение виртуальной функции
        // Реализация в производном классе
    }
    // Метод print не переопределен, но унаследован
};

// В памяти для объекта Derived будет:
// [vptr] -> указывает на таблицу виртуальных методов Derived
// [другие_данные_члены_Derived]
//
// Таблица виртуальных методов Derived (vtable for Derived):
// +-----------------+
// | &Derived::show  |  // Указатель на реализованную в Derived::show
// +-----------------+
// | &Base::print    |  // Указатель на унаследованную из Base::print
// +-----------------+

// Для объекта Base:
// [vptr] -> указывает на таблицу виртуальных методов Base
// [другие_данные_члены_Base]
//
// Таблица виртуальных методов Base (vtable for Base):
// +-----------------+
// | &Base::show     |  // Указатель на Base::show
// +-----------------+
// | &Base::print    |  // Указатель на Base::print
// +-----------------+

Vtable создается компилятором для каждого класса, имеющего виртуальные функции. В таблице содержатся указатели на конкретные реализации виртуальных функций для данного класса. При наследовании и переопределении виртуальных функций, таблица производного класса содержит указатели на переопределенные реализации, а для функций, которые не были переопределены - указатели на реализации из базового класса.