Vtable размещение полностью чисто виртуального класса - PullRequest
4 голосов
/ 06 января 2011

Согласно моим (ограниченным) знаниям спецификации C ++, виртуальная таблица класса с виртуальными членами помещается в определение первого не чистого не встроенного виртуального метода. Как компиляторы обрабатывают классы, которые наследуются от класса со ВСЕМИ чисто виртуальными методами (например, интерфейсами)? Где находится vtable в этом случае?

Ответы [ 3 ]

5 голосов
/ 06 января 2011

В таблице хранятся адреса реализованных виртуальных методов.Если все методы класса являются чисто виртуальными и ни один из них не реализован, тогда не нужно генерировать vtable.

Вы не могли бы использовать такой класс слишком долго без некоторых классов, которые наследуют его и реализуют методы.Каждый класс с реализованными виртуальными методами имеет свою собственную виртуальную таблицу, содержащую адреса для всех виртуальных методов: он никоим образом не ссылается на виртуальные таблицы базовых классов;адреса дублируются.Так что если у вас есть класс, который наследуется от другого класса, этот класс будет использовать только свою собственную vtable.Это не волнует vtable базового класса;этот vtable даже не должен существовать.

Сама спецификация C ++ ничего не говорит о vtables;это просто поведение компилятора, которое стало распространенным явлением.

3 голосов
/ 06 января 2011

Стандарт C ++ не указывает ничего о размещении vtable или даже о существовании v-таблицы. Он просто определяет поведение, и v-таблица оказывается самой простой реализацией, поэтому широко используется.

Практически говоря, единственной причиной существования v-таблицы для абстрактного класса является использование во время конструирования и уничтожения, когда динамический тип объекта является абстрактным классом.

В классе только с чисто виртуальными функциями явно не может быть конструкторов (поскольку конструкторы не могут быть виртуальными). Тем не менее, деструкторы, безусловно, могут быть виртуальными.

Ваш класс все еще может иметь чистый виртуальный деструктор с реализацией, и тогда потребуется v-таблица (или эквивалентные подробности реализации).

Но реализации чисто виртуальных функций встречаются редко, и их нельзя было бы сделать при определении интерфейса.

2 голосов
/ 06 января 2011

Мои ограниченные знания гласят: вам не нужен vtable, пока у вас нет экземпляра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...