Darf ich mal kurz was in die Runde werfen?
Runtime <> Compiletime
In TVisitableBase.Accept ist der formale Typ von Self: TVisitableBase, also wird die Überladung Visit(TVisitableBase) genommen.
In TVisitableDerived wird diese Methode jetzt nur vererbt, ohne dass sich der formale Typ von Self dort ändert, also ändert sich auch nicht, welche Überladung genommen wird.
Zur Laufzeit steckt in dieser Variable aber dann natürlich ein TVisitableDerived.
Wenn wir Accept in der abgeleiteten Klasse jetzt neu deklarieren, ist der formale Typ von Self dort nun TVisitableDerived, und es wird auch die richtige Überladung genutzt.