Я не знаю, есть ли два пути, и я не знаю, чистые ли это или смешанные ОО языки.
В основном, C ++ использует диспетчеризацию виртуальной таблицы - каждый экземпляр несет таблицу функций (в случае C ++ он содержит указатель на таблицу, но это не играет никакой роли в механизме диспетчеризации), и когда вы вызываете x.my_method()
, компилятор знает его например. второй метод объекта, поэтому он генерирует код для перехода ко второму указателю в таблице виртуальных методов.
В динамических языках (и ObjC) это обычно решается наличием где-то словаря методов, где во время выполнения ищется имя my_method
и выполняется любая найденная функция.
Существуют смешанные подходы - в COM вы просматриваете интерфейс по идентификатору; затем вы выполняете метод из его таблицы.
Иногда для ускорения второго подхода генерируется код, похожий на оператор switch (например, switch в зависимости от типа объекта).