Как уже писали другие, общего подхода нет. (Черт, никто даже не требует, чтобы виртуальные таблицы использовались вообще.)
Однако я полагаю, что они, скорее всего, реализованы как скрытый указатель на определенное смещение в объекте, который ссылается на таблицу указателей функций. Адреса некоторых виртуальных функций занимают определенные смещения в этой таблице. Обычно есть также указатель на объект std::type_info
динамического типа.
Если вам интересны такие вещи, прочитайте Lippmann "Внутри объектной модели C ++" . Однако, если ваш интерес не академичен (или вы пытаетесь написать компилятор C ++ - но тогда вам не нужно спрашивать), вам не стоит беспокоиться. Это деталь реализации, которую вам не нужно знать и на которую никогда не следует полагаться.