Dynami c привязка, Stati c привязка, указатель на функцию, глубокий смысл - PullRequest
1 голос
/ 06 января 2020

В статическом c связывании решение вызываемого метода принимается во время компиляции, в динамическом c связывании решение о вызываемом методе принимается во время выполнения. Виртуальные методы вызываются с привязкой Dynami c. Это означает, что на этапе компиляции определяется, какой указатель функции виртуальной таблицы должен быть вызван. Будучи указателем на функцию, не более, чем переменной, которая содержит адрес памяти функции, на которую указывает функция, и определяется во время компиляции, какой указатель для вызова, на мой взгляд, было решено, косвенно, также методом, который должен быть вызван на этапе компиляции.

Итак, мой вопрос: почему сказано, что при динамическом связывании c решение вызываемого метода принимается во время выполнения, когда фактически запись в виртуальной таблице уже была выбранный на этапе компиляции?

1 Ответ

0 голосов
/ 06 января 2020

Stati c привязка происходит, когда вся информация, необходимая для вызова функции, доступна во время компиляции. Dynami c привязка происходит, когда вся информация, необходимая для вызова функции, не может быть определена во время компиляции .

Это мотивация, потому что решение метода вызывается берется во время выполнения. Фактически для виртуальной функции компилятор априори не знает, какую функцию нужно вызывать (это может зависеть от класса, который вызывает функцию). Таким образом, компилятор связывает виртуальную таблицу, но виртуальная таблица может указывать на другую реализацию функции в зависимости от класса объекта. Это информация, которую компилятор во время компиляции не знает, и только во время выполнения разворачивается.

Для более подробной информации c подробности оставьте вам несколько полезных ссылок:

Разница между stati c и динамическими c привязками

Раннее связывание и Позднее связывание

Виртуальные функции и полиморфизм времени выполнения

Взяв в качестве примера это изображение:

enter image description here

, если вы используете экземплярный объект треугольник класса в функции, где параметры являются объектом класса polygon , компилятор априори не знает, какой реальный класс является объектом (если Triangle или Rectangle), но во время выполнения, если вы вызываете метод area() виртуальная таблица указывает на правильный метод класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...