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