В какой момент заполняется матрица переходов (Таблица виртуальных функций)экземпляра класса-потомка?

Рейтинг: 0Ответов: 1Опубликовано: 23.04.2023

Терминология с++: функция-член класса = метод

Мы все знаем, что переопределение функции-члена класса при использовании ключевого слова virtual ведёт к тому, что метод, вызванный по ссылке или указателю экземпляра класса будет определяться в процессе выполнения программы(если я ничего не путаю, если вызывать по названию экземпляра, то этот механизм не работает, метод так же определяется на этапе компиляции). На всякий случай цитата из Праты 6 издание:

Без ключевого слова virtual программа выбирает метод, основываясь на типе ссьтки или указателя . Но если присутствует ключевое слово virtual , программа выбирает метод, основываясь на типе объекта, на который указывает ссылка или указатель.

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

  1. Верно ли я понимаю, что у базовых классов, или классов вне наследственной иерархии такая матрица формируется при компиляции?
  2. В какой момент исполнения программы такая матрица заполняется у экземпляров класса, которые унаследовали виртуальные функции-члены класса

Ответы

▲ 5Принят

Правильное название - таблица виртуальных функций. Никогда не слышал, чтобы кто-то ее называл "матрицей переходов".

Сами таблицы заполняются во время компиляции. Во время выполнения в экземпляр класса записывается только указатель на правильную таблицу.

Насколько я понимаю, этот указатель устанавливается сразу перед заходом в тело конструктора, причем это отдельно делает каждый родитель. А при разрушении класса, они меняются в обратном порядке - каждый класс ставит свой указатель перед заходом в тело своего деструктора.

Это все очень примерно. Сочные подробности, как минимум для GCC и Clang-а, должны быть вот тут.