1. Statische Methoden sind der Standardtyp von Methoden. Sie werden wie normale Prozeduren und Funktionen aufgerufen. Der Compiler kennt die Adressen dieser Methoden, sodass er beim Aufruf einer statischen Methode die laufenden Informationen statisch in die ausführbare Datei einbinden kann. Daher sind statische Methoden am schnellsten, können jedoch nicht überschrieben werden, um Polymorphismus zu unterstützen.
2. Virtuelle Methoden und statische Methoden werden auf die gleiche Weise aufgerufen. Da virtuelle Methoden überschrieben werden können, kennt der Compiler die Adresse einer angegebenen virtuellen Methode nicht, wenn sie im Code aufgerufen wird. Daher sucht der Compiler zur Laufzeit nach der Funktionsadresse, indem er eine virtuelle Methodentabelle (VMT) erstellt. Alle virtuellen Methoden werden zur Laufzeit über VMT verarbeitet. Zusätzlich zu den selbst definierten virtuellen Methoden verfügt die VMT-Tabelle auch über alle ihre virtuellen Methoden. Daher verbrauchen virtuelle Methoden mehr Speicher als dynamische Methoden, werden jedoch relativ schnell ausgeführt.
3. Dynamische Methoden ähneln grundsätzlich virtuellen Methoden, außer dass ihre Höhensysteme unterschiedlich sind. Der Compiler weist jeder dynamischen Methode eine eindeutige Nummer zu und verwendet diese Nummer und die Adresse der dynamischen Methode, um eine dynamische Methodentabelle (DMT) zu erstellen. Im Gegensatz zur VMT-Tabelle sind in der DMT-Tabelle nur dynamische Methoden deklariert, und diese Methode erfordert, dass die Vorgänger-DMT-Tabelle auf andere dynamische Methoden zugreift. Aus diesem Grund verbrauchen dynamische Methoden weniger Speicher als virtuelle Methoden, sind jedoch langsamer in der Ausführung, da sie möglicherweise im DMT des Objekts nach dynamischen Methoden suchen müssen.
4. Das OP verwendet Überschreibungen, um dafür zu sorgen, dass eine Methode in verschiedenen abgeleiteten Klassen unterschiedliche Verhaltensweisen zeigt. Die Methoden, die im OP überschrieben werden können, sind Methoden, die bei der Deklaration als virtuell oder dynamisch markiert sind. Um eine Methode zu überschreiben, verwenden Sie in der abgeleiteten Klassendeklaration „override“ anstelle von „virtual“ oder „dynamic“. Nach der Verwendung von Override ersetzt der Compiler die ursprüngliche Methode in VMT durch eine neue Methode, und die ursprüngliche Methode ist weiterhin vorhanden. Wenn Sie eine statische Methode erneut mit Override deklarieren, handelt es sich um eine echte Überschreibung, die vollständig von der neuen Methode abgedeckt wird . Ersetzen Sie dieselbe Methode in der Vorfahrenklasse.