Есть три вопроса для рассмотрения.Первый - это разрешение перегрузки: в этом случае компилятор использует тип выражения static для построения набора функций, из которых он выбирает.Таким образом, если бы вы написали:
objb->change( 2 );
, код не скомпилировался бы, потому что нет change
, который принимает int
в области действия B
.Если бы в области действия B
вообще не было change
, компилятор посмотрел бы дальше и нашел бы change
(все они) в A
, но как только он находит имя, он останавливается.
Это поиск имени и разрешение перегрузки функций, и оно полностью статично.
Второй вопрос - какую функцию следует вызывать, если компилятор выбрал вызов определенной функции в интерфейсе,Если выбранная функция является виртуальной, то фактической вызываемой функцией будет функция с точно такой же сигнатурой в самом производном классе динамического типа, то есть типе рассматриваемого фактического объекта.
Наконец,возникает вопрос, используется ли динамическая диспетчеризация в сгенерированном коде.И это полностью зависит от компилятора.Компилятор может делать все, что захочет, при условии, что вызывается правильная функция, определенная двумя предыдущими проблемами.Обычно: если функция не виртуальная, динамическая диспетчеризация никогда не будет использоваться;и если доступ осуществляется непосредственно к объекту (именованному или временному объекту), динамическая диспетчеризация, как правило, не будет использоваться, поскольку компилятор может тривиально знать наиболее производный тип.Когда вызов осуществляется через ссылку или указатель, компилятор обычно использует динамическую диспетчеризацию, но иногда компилятор может отслеживать указатель в достаточной степени, чтобы знать тип, на который он будет указывать во время выполнения, и избегать динамической диспетчеризации.И хорошие компиляторы часто идут дальше, используя информацию профилировщика, чтобы определить, что в 99% случаев будет вызываться одна и та же функция, и вызов находится в тесном цикле и будет генерировать две версии цикла, одна с динамической диспетчеризацией.и один с наиболее часто вызываемой функцией inlined, и выберите, какая версия цикла через if, во время выполнения.