Когда вы делаете Base* test = new Derived()
:
Указатель V-таблицы объекта test
устанавливается так, чтобы указывать на V-таблицу класса Derived
.
Обратите внимание, что когда объект создается - через new Derived()
- вы явно вызываете функцию (конструктор) класса Derived
, а не класса Base
.
И когда эта функция вызывается, она устанавливает v -табличный указатель нового объекта, указывающий на V-таблицу класса Derived
, а не на класс Base
.
AFAIK, фактические V-таблицы (обоих классов) генерируются компоновщик, прошедший компиляцию.
Дополнительно:
Программе не нужно «знать», что это функция virtual
.
В случае при вызове невиртуальной функции компилятор добавляет инструкцию JUMP к постоянному адресу (т. е. адресу невиртуальной функции, который разрешается во время компиляции).
В случае вызова виртуальной функции , компилятор добавляет инструкцию JUMP к адресу, хранящемуся в (указанном) переменной, значение которой разрешается только во время выполнения.