Вопрос проверяет понимание механизма динамического полиморфизма в C++ и знание внутренней реализации виртуальных функций.
Vtable (виртуальная таблица) — это ключевой механизм реализации динамического полиморфизма в языках, подобных C++. Когда класс объявляет одну или несколько виртуальных функций, компилятор неявно добавляет в каждый объект этого класса скрытый указатель (часто называемый vptr), который ссылается на таблицу виртуальных функций, уникальную для этого класса.
Для каждого класса с виртуальными функциями компилятор создаёт статическую таблицу в памяти. Эта таблица содержит адреса реализаций всех виртуальных функций данного класса в порядке их объявления. Когда создаётся объект, его скрытый указатель vptr инициализируется адресом vtable своего класса.
class Base {
public:
virtual void func1() { /* реализация Base::func1 */ }
virtual void func2() { /* реализация Base::func2 */ }
int data;
};
class Derived : public Base {
public:
void func1() override { /* переопределённая реализация */ }
// func2 не переопределена, будет использована версия из Base
};
// Пример использования
Base* ptr = new Derived();
ptr->func1(); // Динамический вызов Derived::func1 через vtableВ памяти для объекта Derived будет примерно такая структура:
Vtable для Derived будет содержать: [адрес Derived::func1, адрес Base::func2].
Этот механизм применяется везде, где требуется полиморфное поведение: в библиотеках с иерархиями классов, фреймворках, паттернах проектирования (например, Стратегия, Наблюдатель). Вызов через vtable добавляет небольшие накладные расходы (одно дополнительное разыменование указателя и доступ к массиву), но обеспечивает гибкость и соблюдение принципа подстановки Барбары Лисков.
Вывод: Vtable — фундаментальная реализация полиморфизма в C++. Её стоит понимать для написания эффективного объектно-ориентированного кода и для отладки сложных иерархий классов, хотя в повседневной разработке она скрыта от программиста.