Однако в
программе VIRT компилятор не знает, к какому классу относится
содержимое ptr.Ведь это может быть адрес объекта как класса Derv1, так и класса Derv2. Какую именно версию draw() вызывает компилятор — тоже загадка. На самом деле компилятор не очень понимает, что ему делать, поэтому откладывает принятие решения до фактического запуска программы.
А когда программа уже поставлена на выполнение, когда известно, на что указывает ptr, тогда будет запущена соответствующая версия draw. Такой подход называется поздним связыванием или динамическим связыванием. (Выбор функций в обычном порядке, во время компиляции, называется ранним связыванием или статическим связыванием.)
Позднее связывание требует больше ресурсов, но дает выигрыш в возможностях и гибкости.