Что такое vtable в C++

Возможный дубликат:
зачем мне нужна виртуальная таблица ?

Что такое виртуальная таблица в C++?

Пока я знаю, что vtable — это виртуальная таблица с массивом указателей на виртуальные функции. Есть ли статья, которую я могу прочитать с примером практической реализации? (Любая прогулка будет оценена.)


person Simsons    schedule 24.08.2010    source источник
comment
en.wikipedia.org/wiki/Virtual_method_table   -  person DumbCoder    schedule 24.08.2010
comment
stackoverflow.com/questions/2173493/virtual-table-c   -  person DumbCoder    schedule 24.08.2010
comment
Если вы не планируете писать компилятор, эта информация не имеет отношения к пониманию C++.   -  person Martin York    schedule 24.08.2010
comment
Жаль, что этот считается дубликатом. Принятый ответ на этот вопрос лучше, чем ответ на оригинал.   -  person Adrian McCarthy    schedule 14.02.2017


Ответы (3)


V-таблицы (или виртуальные таблицы) — это то, как большинство реализаций C++ реализуют полиморфизм. Для каждой конкретной реализации класса существует таблица указателей функций на все виртуальные методы. Указатель на эту таблицу (называемую виртуальной таблицей) существует как элемент данных во всех объектах. Когда кто-то вызывает виртуальный метод, мы просматриваем v-таблицу объекта и вызываем соответствующий метод производного класса.

person doron    schedule 24.08.2010
comment
Если ваш базовый класс Foo имеет виртуальный метод, тогда ваш производный класс Bar будет иметь vtable, и компоновщик проверит это (если он отсутствует, это говорит, что неопределенная ссылка на `vtable для Bar') - person Will; 28.06.2017

vTable (виртуальная таблица) — это деталь реализации динамической диспетчеризации (virtual методов).

Дополнительные сведения см. в разделе C++-Lite-Faq.

person phadej    schedule 24.08.2010
comment
Ссылка битая, обновите или удалите. - person donturner; 05.12.2017
comment
@donturner ИМХО, голосование против было грубым. Google C++ Lite Faq дает страницу как второй результат. Вы могли бы избавить меня от других проблем, отредактировав ответ самостоятельно. Ведь ответ 7 лет. - person phadej; 07.12.2017
comment
Ответы только на ссылку @phadej не одобряются именно по этой причине: внешний ресурс может быть перемещен, удален или изменен, и ответ здесь должен быть самодостаточным. - person bolov; 07.12.2017
comment
Ссылка работает! Очень Хорошая Статья! - person Nir Duan; 10.01.2018
comment
Это само определение ответа только по ссылке. - person AJMansfield; 16.07.2018
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. – Из обзора - person CalvT; 16.07.2018
comment
@CalvT Мне очень хочется поискать в истории руководств, когда была введена примечание только для ссылок. Метавопрос meta.stackexchange.com/questions/92505/ - person phadej; 16.07.2018
comment
@phadej Я отвечаю на ваш метапост одним из моих собственных - Должен ли я отметить старые не-ответы?. - person CalvT; 16.07.2018
comment
@CalvT вы не можете просто удалить весь вопрос, так как он помечен как дубликат. Мне действительно все равно, улучшая этот ответ. Хотя добавил фразу. Надеюсь, сделает вас счастливым. - person phadej; 16.07.2018
comment
@CalvT также вопрос: есть ли статья с практической реализацией? - person phadej; 16.07.2018
comment
@phadej тогда вопрос не по теме. Если у вас есть проблема со мной и четырьмя другими людьми, которые думают, что ваш ответ не является ответом, то обязательно напишите мета-пост, и я с радостью изменю свое мнение в зависимости от его результатов. Я понимаю, что это старый вопрос и ответ, но все вопросы и ответы на сайте должны соответствовать сегодняшним правилам, а не правилам того, когда они были опубликованы. - person CalvT; 16.07.2018

Как бы то ни было, это не стандартная терминология C++. Это просто деталь реализации, используемая реализацией для реализации виртуальных функций/динамической привязки.

person Chubsdad    schedule 24.08.2010
comment
Это не стандартная терминология и не стандартизированная вообще, но вполне стандартный термин. В любом случае, это было бы лучше в качестве комментария, поскольку он не пытается ответить на вопрос. - person Potatoswatter; 24.08.2010