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