Достаточно достойный ответ на этот вопрос фактически включен в вопрос о позднем и раннем привязке к programers.stackexchange.com .
Короче говоря, поздняя привязка относится к объекту - стороне eval, динамическая отправка относится к функциональной стороне. При позднем связывании тип переменной является вариантом во время выполнения. В динамической диспетчеризации выполняется функция или подпрограмма.
В C ++ у нас на самом деле нет поздней привязки, потому что известен тип (не обязательно конец иерархии наследования, но по крайней мере формальный базовый класс или интерфейс) , Но мы делаем динамическую отправку с помощью виртуальных методов и полиморфизма.
Лучший пример, который я могу предложить для позднего связывания, - это нетипизированный «объект» в Visual Basic. Среда выполнения выполняет весь тяжелый подъем для вас.
Dim obj
- initialize object then..
obj.DoSomething()
Компилятор фактически закодирует соответствующий контекст выполнения для среды выполнения для выполнения именованного поиска метода с именем DoSomething
, и если они обнаружены с соответствующими параметрами соответствия, фактически выполните основной вызов. В действительности, что-то о типе объекта известно (он наследует от IDispatch
и поддерживает GetIDsOfNames()
и т. Д.). но в отношении языка тип переменной во время компиляции совершенно неизвестен, и он не знает, является ли DoSomething
даже методом для любого obj
на самом деле равно , пока время выполнения не достигнет точки выполнения.
Я не буду беспокоить демпинг виртуального интерфейса C ++ et'al, так как я уверен, вы уже знаете, что они выглядит как. Надеюсь, что язык C ++ просто не может этого сделать. Он строго типизирован. Он может (и делает, очевидно) динамическую отправку через функцию полиморфного виртуального метода.