Според моите (ограничени) познания за спецификацията на C++, vtable на клас с виртуални членове се поставя в дефиницията на първия не-чист не-вграден виртуален метод. Как компилаторите обработват класове, които наследяват от клас с ВСИЧКИ чисти виртуални методи (интерфейси, например)? Къде е поставена vtable в този случай?
Vtable разполагане на напълно чист виртуален клас
Отговори (3)
Vtable съхранява адресите на внедрените виртуални методи. Ако всички методи на даден клас са чисто виртуални и нито един не е имплементиран, тогава не е необходимо да се генерира vtable.
Не бихте могли да използвате такъв клас дълго време без някои класове, които произлизат от него и прилагат методите. Всеки клас с внедрени виртуални методи има своя собствена единствена vtable, съдържаща адреси за всички виртуални методи: тя по никакъв начин не препраща към vtables на базовите класове; адресите се дублират. Така че, ако имате клас, който наследява от друг клас, този клас ще използва само своя собствена vtable. Не се интересува от vtable на базовия клас; тази vtable дори не е необходимо да съществува.
Самата спецификация на C++ не казва нищо за vtables; те са просто поведение на компилатор, което е станало обичайно.
РЕДАКТИРАНЕ от 2020 г.: Написах това преди почти десетилетие. Подозирам, че го написах по памет и личен опит. Два коментара по-долу показват, че компилаторите правят правят vtables за базови класове (за хвърляне на грешки), въпреки че ако е така, не знам как бихте конструирали обект за тях и че някои компилатори използват повторно vtables на базови класове. Изглежда, че никой не е добавил нищо от 2011 г., а сега имам когнитивен спад и вече е трудно наистина да мисля много, така че направете собствено проучване, ако някои подробности тук са от решаващо значение.
Стандартът C++ не уточнява нищо относно разположението на vtable или дори съществуването на v-table. Той просто указва поведението и v-таблицата се оказва най-простата реализация, следователно широко използвана.
Практически казано, единствената причина v-таблицата да съществува за абстрактен клас е за използване по време на изграждане и разрушаване, когато динамичният тип на обекта е абстрактният клас.
В клас само с чисти виртуални функции очевидно не може да има конструктори (тъй като конструкторите не могат да бъдат виртуални). Въпреки това деструкторите със сигурност МОГАТ да бъдат виртуални.
Вашият клас все още може да има чист виртуален деструктор с имплементация и след това се изисква v-таблица (или еквивалентни подробности за реализация).
Но имплементациите на чисто виртуални функции са рядкост и не биха били направени при дефиниране на интерфейс.
Не се нуждаете от vtable, докато нямате екземпляр.