vtable создается во время компиляции.Когда новый объект создается во время выполнения, скрытый указатель виртуальной таблицы устанавливается так, чтобы он указывал на виртуальную таблицу.
Имейте в виду, однако, что вы не сможете надежно использовать виртуальные функции, пока объект не будетполностью построен.(Нет вызова виртуальных функций в конструкторе.)
РЕДАКТИРОВАТЬ Я думал, что я отвечу на вопросы в комментариях.
Как было указано, точные деталио том, как создается и используется vtable, остается до реализации.Спецификация c ++ предоставляет только определенные поведения, которые должны быть гарантированы, так что есть много возможностей для реализации.Он не должен использовать vtables вообще (хотя большинство из них).Как правило, вам не нужно знать эти детали.Вам просто нужно знать, что когда вы вызываете виртуальную функцию, она делает то, что вы ожидаете, независимо от того, как это делает.
Тем не менее, я проясню пару моментов о типичнойреализация.Класс с виртуальными функциями имеет скрытый указатель (мы будем называть vptr), который указывает на vtable для этого класса.Предположим, у нас есть класс сотрудника:
class Employee {
public:
virtual work();
};
Этот класс будет иметь vptr в своей структуре, поэтому на самом деле он может выглядеть так:
class Employee {
public:
vtble *vptr; // hidden pointer
virtual work();
};
Когда мы наследуем этот класс,он также будет иметь vptr, и он должен быть в том же месте (в этом случае, в начале).Таким образом, когда вызывается функция, независимо от типа производного класса, она всегда использует vptr в начале для поиска нужной таблицы.