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