В случае не чистых виртуальных функций каждая запись в vtable будет ссылаться на final-overrider или thunk , который адаптирует указатель this
при необходимости.В случае чисто-виртуальной функции запись в виртуальной таблице обычно содержит указатель на универсальную функцию, которая выдает жалобу и прерывает программу с каким-то разумным сообщением (чисто виртуальная функция вызывается в этом контексте). или подобное сообщение об ошибке).
Будет ли гипотетический компилятор создавать виртуальную таблицу для класса только с чисто виртуальными функциями?
Да, разница будетбудет в содержании, хранящемся в таблице, а не в форме таблицы.В упрощенном подходе указатель NULL для чисто виртуальных функций, ненулевой для виртуальных функций.Реально, указатель на обобщенную функцию, которая будет жаловаться и abort()
с обычными компиляторами.
Что если класс содержит чисто виртуальные функции с определениями?
Это будетне влияет на vtable.Vtable используется только для динамической диспетчеризации, и вызов никогда не будет динамически отправляться на определение чисто виртуальной функции (т. Е. Вы можете вручную передать только виртуальную функцию, отключив динамическую диспетчеризацию с указанием имени типа: x.base::f()
вызовет base::f
, даже если он чисто виртуальный , но x.f()
никогда не будет отправлен на base::f
, если он чисто виртуальный.