Виртуальная таблица (в реализациях, использующих такую вещь) является продуктом «магии компилятора». Он не должен иметь определенный прототип, потому что ни один C++-код никогда не использует его напрямую. Вместо этого компилятор настраивает, чтобы он соответствовал каждому классу, который ему нужен. Компилятор также генерирует код для доступа к каждому элементу, поэтому он может гарантировать доступ к каждому из них безопасным образом.
Например, компилятор знает, что слот для метода A::setValue
содержит указатель на функцию, которая соответствует подписи setValue
, потому что компилятор - это тот, который помещает ее туда в первую очередь. Кроме того, единственным кодом, который напрямую обращается к этому слоту, является машинный код, сгенерированный компилятором, и до создания такого кода компилятор уже подтвердил, что исходный код на C++ вызывал функцию setValue
. Таким образом, нет никаких сомнений в том, что слот setValue
мог бы удерживать что-либо, кроме указателя функции setValue
. Также не вызывает беспокойства, что к другому слоту можно было бы обратиться; если это произойдет, это будет ошибка компилятора, никогда не произойдет что-то, что произойдет в результате обычного кода пользователя.
Элементы таблицы никогда не рассматриваются как группа, поэтому нет требования, чтобы все они имели один и тот же тип. В лучшем случае все они имеют тип «общего указателя или смещения, подходящего для перехода к CPU». Поскольку на данный момент это не C++, «тип» не должен соответствовать какому-либо конкретному типу C++.
Возможный дубликат [Что такое структура виртуальных таблиц в C++?] (Http://stackoverflow.com/questions/5868431/what-is-the-structure-of-virtual-tables-in-c) –