В соответствии с моим (ограниченным) знанием спецификации C++ vtable класса с виртуальными членами помещается в определение первого нечистого не встроенного виртуального метода. Как компиляторы обрабатывают классы, которые наследуют от класса со всеми чистыми виртуальными методами (интерфейсы, например)? Где находится таблица vtable в этом случае?Размещение Vtable полностью чистого виртуального класса
ответ
В таблице v хранится адрес реализованных виртуальных методов. Если все методы класса являются чисто виртуальными и ни один из них не реализован, то не нужно создавать vtable.
Вы не могли бы использовать такой класс для многих без каких-либо классов, которые вытекают из него и реализуют методы. Каждый класс с реализованными виртуальными методами имеет свой собственный единственный vtable, содержащий адреса для всех виртуальных методов: он никоим образом не ссылается на vtables базовых классов; адреса дублируются. Поэтому, если у вас есть класс, который наследуется от другого класса, этот класс будет использовать только свою собственную таблицу vtable. Он не заботится о vtable базового класса; этот vtable даже не должен существовать.
В самой спецификации C++ ничего не говорится о vtables; это просто поведение компилятора, которое стало обычным явлением.
Интересно. Я бы подумал, что наличие повторяющихся таблиц нарушит какое-то одно правило определения. – tgoodhart
Ни одна из таблиц не дублируется. Новая таблица создается только в том случае, если виртуальный метод реализуется этим классом; это делает уникальную vtable, содержащую указатель на эту реализацию. Таблица будет содержать повторяющиеся адреса для любых неизменных виртуальных методов. – fuzzyTew
Если все методы класса являются чисто виртуальными, ни один из них не реализован
Это просто неправда. В C++ чистый виртуальный не означает никакой реализации. –
Мои ограниченные знания гласят: вам не нужна виртуальная таблица, пока у вас нет экземпляра.
Какой пример? Компилятор понятия не имеет при компиляции единого ТУ, будь то чистые виртуальные функции будут иметь реализацию, определенную в другом ТУ. Компилятор-реализатор может решить, как с ним бороться, и это может быть разумным решением для создания vtable и установки указателей на функцию ошибок для сообщения о незаконных вызовах неопределенных чистых виртуальных функций. –
В стандарте C++ не указано ничего о размещении vtable или даже о существовании v-таблицы. Он просто определяет поведение, а v-таблица - самая простая реализация, поэтому широко используется.
Практически говоря, одна причина существования v-таблицы для абстрактного класса применима во время построения и уничтожения, когда динамический тип объекта является абстрактным классом.
В классе с чистыми виртуальными функциями явно нет конструкторов (поскольку конструкторы не могут быть виртуальными). Однако деструкторы, безусловно, могут быть виртуальными.
У вашего класса все еще может быть pure virtual destructor с реализацией, а затем требуется v-таблица (или эквивалентные детали реализации).
Но реализации чистых виртуальных функций редки и не будут выполняться при определении интерфейса.
- 1. C++ форвардная декларация чистого виртуального класса
- 2. Выведение из чистого виртуального класса шаблона
- 3. Создание нового указателя чистого виртуального класса
- 4. Отображение чистого виртуального класса C++ в окне просмотра VS2010 показывает только vtable
- 5. шаблона специализации чистого виртуального метода
- 6. Реализация чистого виртуального метода с/без виртуального?
- 7. У каждого объекта виртуального класса есть указатель на vtable?
- 8. Захват чистого виртуального вызова R6025
- 9. Выведение из виртуального класса
- 10. Есть ли способ вызвать «удаление деструктора» из чистого виртуального класса?
- 11. undefined ссылка на vtable для дочернего класса
- 12. Изменение VTable внешнего класса
- 13. Pimpl idiom vs Чистый интерфейс виртуального класса
- 14. Виртуальные вызовы, использующие адрес чистого виртуального участника. Это законно?
- 15. виртуальных таблицы ошибок C++, после реализации чистого виртуального метода
- 16. переход от чистого виртуального к виртуальному в C++
- 17. Как перебирать vtable COM-класса?
- 18. undefined ссылка на `vtable для класса
- 19. Возврат std :: unique_ptr <T> от заводской функции, создающей полностью скрытую реализацию чистого виртуального интерфейса
- 20. Виртуальный деструктор C++ & vtable
- 21. Инициирование абстрактный класс в C++ с использованием чистого виртуального метода
- 22. Sub-причислять шаблонный класс без реализации чистого виртуального метода
- 23. C++ undefined ссылка на vtable
- 24. Участник виртуального базового класса
- 25. Метод виртуального класса C++
- 26. Scala: Получение чистого имени класса
- 27. Понятие виртуального
- 28. Неопределенный Ссылка на «vtable» для производного класса
- 29. Как отобразить VTABLE класса C++ через GCC?
- 30. Получить таблицу vtable класса без объекта
Сама спецификация C++ ничего не говорит о vtables. –
Тяжелая реализация подробно. MSVC++ имеет __declspec (novtable) для подавления такой vtable. И нестандартное ключевое слово __interface делает то же самое. –