Комментарии 6
Спасибо за перевод. Картинок бы хотелось. А то текстовое описание указателей, указывающих на указывающие на методы указатели немного трудно воспринимать.
Я предполагаю, что некоторые люди сочтут это слишком низким уровнем, или, возможно, просто не имеющим практической ценности.
Гнать таких людей в шею. Хотя бы обзорное представление иметь нужно. Особенно сильно пригождается в embedded: мне приходилось анализировать стрельбу по vtable. А то будет возникать недоумение: у меня тут функция non-pure-virtual вызывается, а исключение по нулевому адресу генерируется, КАК ТАКОЕ ВОЗМОЖНО ВООБЩЕ!!!111 Ну или когда вдруг работает код, совершено не тот, который ожидается. Кроме того, просто становится понятным: почему не стоит вызывать виртуальные функции в конструкторе и деструкторе, особенно в базовых классах.
Другое дело, что не стоит полагаться на это при кодировании, завязывать логику и, тем более, какие-то хаки.
Надо бы где-нибудь разжиться спецификацией на ABI C++ и/или документацией на компиляторы, вместо того, чтобы заниматься реверс-инжинерингом "что же там гусь накомпилил".
Моего гугл-фу не хватило найти сейчас спеки на гуся/шланга/студию.
Всё, что нашёл более-менее толкового — это проект документации "Itanium C++ ABI" (там тексты разной степени древности, от 1999 до 2017)
Вот тут — сводная таблица примеров разных наследований и лэяутов таблиц.
https://itanium-cxx-abi.github.io/cxx-abi/cxx-vtable-ex.html
Или вот ещё: https://refspecs.linuxfoundation.org/cxxabi-1.86#vtable
Но там очень многабукв на английском
C++ vtables. Часть 1 (basics + multiple Inheritance)