2011-01-06 3 views
4

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

+3

Сама спецификация C++ ничего не говорит о vtables. –

+1

Тяжелая реализация подробно. MSVC++ имеет __declspec (novtable) для подавления такой vtable. И нестандартное ключевое слово __interface делает то же самое. –

ответ

5

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

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

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

+0

Интересно. Я бы подумал, что наличие повторяющихся таблиц нарушит какое-то одно правило определения. – tgoodhart

+0

Ни одна из таблиц не дублируется. Новая таблица создается только в том случае, если виртуальный метод реализуется этим классом; это делает уникальную vtable, содержащую указатель на эту реализацию. Таблица будет содержать повторяющиеся адреса для любых неизменных виртуальных методов. – fuzzyTew

+1

Если все методы класса являются чисто виртуальными, ни один из них не реализован Это просто неправда. В C++ чистый виртуальный не означает никакой реализации. –

2

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

+0

Какой пример? Компилятор понятия не имеет при компиляции единого ТУ, будь то чистые виртуальные функции будут иметь реализацию, определенную в другом ТУ. Компилятор-реализатор может решить, как с ним бороться, и это может быть разумным решением для создания vtable и установки указателей на функцию ошибок для сообщения о незаконных вызовах неопределенных чистых виртуальных функций. –

3

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

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

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

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

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

Смежные вопросы