Eine wirkliche virtuelle Funktion

Beispielprogramm: VIRTL6.CPP

Schließlich sind wir doch zu einem Programm mit einer virtuellen Funktion, die sich auch wie eine virtuelle Funktion benimmt und den Polymorphismus illustriert, vorgedrungen. Es ist das Programm mit dem Namen VIRTL6.CPP.

Das Programm ist mit dem letzten identisch, nur haben wir in Zeile 9 das Schlüsselwort virtual wieder eingefügt, um die Methode Nachricht() zu einer virtuellen Methode zu machen. Es genügt, das Schlüsselwort virtual in der Basisklasse zu verwenden, die entsprechende Methode in den abgeleiteten Klassen wird vom System automatisch als virtual deklariert. In diesem Programm verwenden wir wieder den einzelnen Zeiger auf die Basisklasse, um Objekte zu erzeugen, zu verwenden, und zu löschen. Dies tun wir mit demselben Code wie im letzten Programm. Allein durch das Schlüsselwort virtual in Zeile 9 ist dieses Programm aber vom vorigen komplett verschieden.

Da die Methode Nachricht() in der Basisklasse als virtuelle Methode deklariert worden ist, wird jedesmal, wenn wir diese Methode mit einem Zeiger auf die Basisklasse aufrufen, eigentlich die Methode einer der abgeleiteten Klassen ausgeführt. Das ist aber nur der Fall, wenn in der abgeleiteten Klasse eine Methode mit diesem Namen existiert und der Zeiger auf ein Objekt dieser Klasse zeigt. Beim Ausführen des Programmes erhalten wir das gleich Ergebnis wie in den Programmen, in denen wir die Methoden der abgeleiteten Klassen direkt aufgerufen haben. Jetzt aber verwenden wir eine Zeiger auf den Typ der Basisklasse für die Methodenaufrufe.

Obwohl also der Code in den Zeilen 44, 48, 52 und 56 derselbe ist, entscheidet das System anhand des Typs, auf den der Zeiger zeigt, welche Methode ausgeführt wird. Diese Entscheidung fällt nicht beim Kompilieren, sondern erst beim Ausführen des Programmes. Das kann in manchen Programmiersituationenen sehr nützlich sein. Eigentlich passieren hier nur drei verschiedene Aufrufe, da die Klasse Laster keine Methode mit dem Namen Nachricht() hat und das System einfach die Methode der Basisklasse verwendet. Aus diesem Grund muß eine virtuelle Funktion eine Implementation in der Basisklasse haben, die verwendet werden kann, wenn für eine oder mehrere abgeleitete Klassen keine verfügbar ist. Beachte, daß die Nachricht eigentlich an einen Zeiger auf das Objekt gesendet wird, aber das ist eine gewisse Haarspalterei, die uns jetzt nicht allzu wichtig sein sollte.

Es ist vielleicht nicht offensichtlich, Du hast aber wahrscheinlich bemerkt, daß die Struktur der virtuellen Funktion in der Basisklasse und in jeder der abgeleiteten Klassen identisch ist. Der Rückgabetyp und die Anzahl sowie die Typen der Parameter müssen für alle Funktionen identisch sein, da wir ja mit der gleichen Anweisung eine jede der Funktionen aufrufen können.

(weiter...)