Lektion 78:

Polymorphie

Das Nichtfunktionieren liegt daran, daß der Compiler für den Aufruf von

   pKto->anzeigen();

einfach nur nachgeschaut hat, auf welchen Typ pKto zeigt, und die entsprechende Methode aufruft. Die entsprechende Methode ist die anzeigen-Methode in der Klasse Konto. Obwohl pKto wirklich auf ein Girokonto zeigt, wird nur die anzeigen-Methode von Konto aufgerufen.

Man kann aber einstellen, daß das Programm bei jedem Aufruf von

   pKto->anzeigen();

nachschaut, zu welcher Klasse das Objekt, auf das pKto zeigt, wirklich gehört, und dann die richtige Funktion aufruft. Dieses Art des Aufrufs wird dynamisches Binden genannt, weil die Zuordnung der richtigen Funktion zur Laufzeit geschieht, im Gegensatz zum statischen Binden, das der Compiler durchführen kann.

In C++ ist das statische Binden der Normalfall. Das ist eine Besonderheit von C++. In anderen objektorientierten Sprachen ist dynamisches Binden angesagt. Man hat sich in C++ für statisches Binden entschieden, weil es geringfügig schneller ausgeführt werden kann. Um dynamisches Binden zu erzwingen, muß das Schlüsselwort virtual verwendet werden.

Dazu wird einfach die entsprechende Methode in der Basisklasse als virtual deklariert.

Schreiben Sie also in der Klasse Konto:

   virtual void anzeigen()
   {
      cout<<"Kontostand: "<<kontostand<<endl;
   };

Heureka, es funktioniert!

Die virtual-Deklaration in der Basisklasse sorgt dafür, daß die anzeigen-Funktion virtuell ist. Auch alle in den Unterklassen deklarierten anzeigen-Funktionen werden automatisch virtuell. Um das im Auge zu behalten, bietet es sich an, dort einen entsprechenden Kommentar zu setzen.

void anzeigen()//virtual in Konto
   {
      cout<<"Kontostand: "<<kontostand<<endl;
      cout<<"Ueberziehungsrahmen: "<<ueberziehungsrahmen<<endl;
   };


Falls Ihnen Fehler im Text auffallen oder Sie Verbesserungsvorschläge haben, dann schicken Sie mir bitte eine Mail. Ich werde mich dann sofort darum kümmern.
[aktuelle Version] [inhalt] [index]      [Fehlerkorrektur, Verbesserungsvorschlag]

© Volkard Henkel <volkard@normannia.de>, last update: 08/25/00