Metody wirtualne są realizowane za pomocą wirtualnej tabeli metod (VMT). Dla każdej klasy istnieje jeden VMT. VMT zawiera jeden wpis dla każdej wirtualnej metody w klasie. I ten wpis jest adresem metody.
Pozwala to na bardzo wydajne nawiązywanie połączeń. Po prostu otrzymasz adres VMT, który znajduje się w stałej zmianie od Self
. Następnie wyszukujesz wskaźnik metody według indeksu i wywołujesz metodę.
Co to znaczy, że jeśli masz klasę z wieloma wirtualnymi metodami, a ty uzyskujesz pod-klasę, stworzysz zupełnie nowy VMT ze wszystkimi wirtualnymi metodami. A jeśli nie zastąpiłeś wielu z nich, to przekonasz się, że VMT mają wiele pokryć się.
To miało znaczenie w dniach 16 bitów. VMT mogą zajmować dużo miejsca w obrazie wykonywalnym (co oznacza rozmiar kodu) i może zabraknąć miejsca dla VMT. Wprowadzono więc metody dynamiczne. Analogiem do VMT jest tablica metod dynamicznych, DMT. Jest to realizowane inaczej, aby uniknąć powtarzania, gdy metody nie są nadpisywane. Minusem jest to, że wywoływanie metod dynamicznych jest droższe.
W czasach współczesnych, od 32-bitowych, a zwłaszcza z bardzo grubymi plikami wykonywalnymi, które produkuje Delphi, problemy z wielkością nie mają znaczenia. Tak więc wszelką rozsądną radą jest stosowanie wyłącznie metod wirtualnych.
Implementacje tabel metod wirtualnych są dobrze znane i istnieje wiele odnośników do ich zrozumienia. W mniejszym stopniu dotyczy to metod dynamicznych, które są dość osobliwe. Najlepszym źródłem informacji znalazłem są z bloga Hallvarda Vassbotn za:
Dwa cytaty powiedzieć, co trzeba wiedzieć. Dolna linia jest, moim zdaniem, zawsze używana wirtualnie. –
@DavidHeffernan Post edytowany! – EProgrammerNotFound