Talemantros hat folgendes geschrieben : |
Also hat die Subklasse auch die Methode der Basisklasse, die aufrufbar wäre. |
Richtig. Zur Erklärung stell dir deine Klasse als Aktenordner vor. Darin stehen nun die einzelnen Seiten mit den aufrufbaren Methoden. Beim Kompilieren wird aus dem Aufruf einer solchen Methode "Rufe mal das auf was auf Seite XY steht".
Wird nun eine neue abgeleitete Klasse erstellt, werden die Seiten der Elternklasse kopiert und in den Ordner der abgeleiteten Klasse übernommen. Sprich eine Klasse hat immer nur einen Ordner mit allen Definitionen, nutzt also keine Verlinkung auf die Elternklasse dafür.
Wird nun eine Methode beim Kompilieren gesucht, wird zuerst die der aktuellen Klasse gefunden, so dass eine gleichnamige der Elternklasse nicht aufgerufen wird. Packst du aber dein Objekt in eine Variable vom Typ der Elternklasse, wird deren Teil der Tabelle der Klasse als Startpunkt der Suche benutzt. Da steht aber noch die Methode der Elternklasse drin, so dass diese aufgerufen wird.
So, nun wird eine Methode überschrieben. Das bedeutet, dass keine neue Definition hinzugefügt wird, sondern die erste Definition in dem Aktenordner durch die neue ersetzt wird.
Egal von wo du nun anfängst zu suchen, du findest in dem Aktenordner immer nur die neue Definition. Deshalb ist es dann egal von welchem Typ die Variable ist, in dem das Objekt liegt.
Zu den Begriffen:
Der Aktenordner ist dabei die
Virtual Method Table, die Definition, die darin ersetzt wird, ein
Pointer mit der Adresse, an der die Befehle für die Methode stehen.
Die Abgrenzung Klasse vs. Objekt solltest du dir ggf. noch einmal separat anschauen, das wollte ich hier nicht auch noch einbauen, es sollte ja einfach bleiben.
