Lassen Sie mich Ihnen ein Beispiel für die Unterschiede geben, da sie NICHT gleich sind. Ja, beim dynamischen Versand können Sie die richtige Methode auswählen, wenn Sie von einer Oberklasse auf ein Objekt verweisen. Diese Magie ist jedoch sehr spezifisch für diese Klassenhierarchie, und Sie müssen einige Deklarationen in der Basisklasse ausführen, damit sie funktioniert (abstrakte Methoden) Füllen Sie die vtables aus, da sich der Index der Methode in der Tabelle nicht zwischen bestimmten Typen ändern kann. Sie können also Methoden in Tabby, Lion und Tiger über einen generischen Katzenzeiger aufrufen und sogar Arrays von Katzen mit Lions, Tigers und Tabbys füllen. Es weiß, auf welche Indizes sich diese Methoden zur Kompilierungszeit in der vtable des Objekts beziehen (statische / frühe Bindung), obwohl die Methode zur Laufzeit ausgewählt ist (dynamischer Versand).
Jetzt können Sie ein Array implementieren, das Löwen, Tiger und Bären enthält! ((Oh mein!)). Angenommen, wir haben keine Basisklasse namens Animal. In C ++ müssen Sie erhebliche Arbeiten ausführen, da der Compiler Sie keinen dynamischen Versand ohne eine gemeinsame Basisklasse zulässt. Die Indizes für die vtables müssen übereinstimmen, und das kann nicht zwischen nicht wiederholten Klassen durchgeführt werden. Sie benötigen eine Tabelle, die groß genug ist, um die virtuellen Methoden aller Klassen im System aufzunehmen. C ++ - Programmierer sehen dies selten als Einschränkung an, da Sie darin geschult wurden, eine bestimmte Art und Weise über das Klassendesign nachzudenken. Ich sage nicht, dass es besser oder schlechter ist.
Bei einer späten Bindung sorgt die Laufzeit dafür ohne eine gemeinsame Basisklasse. Normalerweise wird ein Hash-Tabellensystem verwendet, um Methoden in den Klassen mit einem im Dispatcher verwendeten Cache-System zu finden. In C ++ kennt der Compiler alle Typen. In einer spät gebundenen Sprache kennen die Objekte selbst ihren Typ (es ist nicht typenlos, die Objekte selbst wissen in den meisten Fällen genau, wer sie sind). Dies bedeutet, dass ich Arrays von mehreren Arten von Objekten haben kann, wenn ich möchte (Löwen und Tiger und Bären). Sie können die Nachrichtenweiterleitung und das Prototyping (ermöglicht das Ändern von Verhaltensweisen pro Objekt, ohne die Klasse zu ändern) und alle möglichen anderen Dinge auf eine Weise implementieren, die viel flexibler ist und zu weniger Code-Overhead führt als in Sprachen, die keine späte Bindung unterstützen .
Haben Sie jemals in Android programmiert und findViewById () verwendet? Sie werden fast immer das Ergebnis umwandeln, um den richtigen Typ zu erhalten, und das Umwandeln liegt im Grunde darin, den Compiler zu belügen und alle statischen Typprüfungen aufzugeben, die statische Sprachen überlegen machen sollen. Natürlich könnten Sie stattdessen findTextViewById (), findEditTextById () und eine Million andere haben, damit Ihre Rückgabetypen übereinstimmen, aber das wirft Polymorphismus aus dem Fenster; wohl die ganze Basis von OOP. In einer spät gebundenen Sprache können Sie wahrscheinlich einfach anhand einer ID indizieren und diese wie eine Hash-Tabelle behandeln, ohne sich darum zu kümmern, welcher Typ indiziert oder zurückgegeben wurde.
Hier ist ein weiteres Beispiel. Nehmen wir an, Sie haben Ihre Lion-Klasse und das Standardverhalten besteht darin, Sie zu essen, wenn Sie sie sehen. Wenn Sie in C ++ einen einzelnen "ausgebildeten" Löwen haben möchten, müssen Sie eine neue Unterklasse erstellen. Mit Prototyping können Sie einfach die eine oder zwei Methoden dieses bestimmten Löwen ändern, die geändert werden müssen. Es ist Klasse und Typ ändern sich nicht. C ++ kann das nicht. Dies ist wichtig, da Sie einen neuen "AfricanSpottedLion", der von Lion erbt, auch trainieren können. Das Prototyping ändert die Klassenstruktur nicht, sodass es erweitert werden kann. Auf diese Weise behandeln diese Sprachen normalerweise Probleme, die normalerweise eine Mehrfachvererbung erfordern, oder auf diese Weise behandeln Sie einen Mangel an Prototyping.
Zu Ihrer Information, Objective-C ist C, wobei die Nachrichtenübermittlung von SmallTalk hinzugefügt wurde, und SmallTalk ist das ursprüngliche OOP, und beide sind spät mit allen oben genannten und weiteren Funktionen verbunden. Spät gebundene Sprachen können vom Standpunkt der Mikroebene aus etwas langsamer sein, ermöglichen jedoch häufig die Strukturierung des Codes auf eine Weise, die auf Makroebene effizienter ist, und alles läuft auf die Präferenz hinaus.