Lektion 80:

Abstrakte Basisklasse

Eigentlich soll es nur Objekte der Klassen Sparkonto und Girokonto geben. Objekte der Klasse Konto sind nicht sinnvoll. Konto ist nur als Basisklasse zu verwenden.

Eine solche Klasse heißt abstrakte Basisklasse. Der Compiler wird nicht zulassen, daß ein Objekt einer abstrakten Klasse angelegt wird. Um eine Klasse zu einer abstrakten Klasse zu machen, muß eine Funktion als rein virtuell gekennzeichnet werden.

Eine rein virtuelle Funktion wird natürlich auch an die Unterklassen vererbt. Diese Klassen sind dann auch abstrakt. Sie können aber die Abstraktheit "abschütteln", indem sie die rein virtuelle Funktion mit einer nicht rein virtuellen Funktion überschreiben.

Die Methode Konto::jahresabschluss soll rein virtuell werden.

Fügen Sie in die Klasse Konto

   virtual void jahresabschluss()=0
   {//do nothing
   };

ein. Das "=0" am Ende sagt: "Diese Methode ist rein virtuell".

Im Hauptprogramm

void main()
{
   Konto k;
   k.anzeigen();
};

meldet der Compiler

==> error : 'Konto' : cannot instantiate abstract class due to following members:
error : 'void Konto::jahresabschluss(void)' : pure virtual function was not defined

Damit will der Compiler sagen, daß wegen der rein virtuellen Funktion Konto::jahresabschluß die Klasse Konto abstrakt ist, und kein Objekt dieser Klasse angelegt werden kann.

Auch das Programm

void main()
{
   Girokonto k;
   k.anzeigen();
};

ergibt solche Fehlermeldungen, weil Girokonto auch abstrakt ist. Dies kann aber abgestellt werden, indem in die Klasse Girokonto die Methode jahresabschluss eingefügt wird.

Weil es keine Objekte der Klasse Konto geben kann, kann auch Konto::jahresabschluss nicht aufgerufen werden. Deswegen wird keine Implementierung für diese Methode benötigt. Es reicht also ein Funktionsprototyp.

Schreiben Sie also in der Klasse Konto statt

   virtual void jahresabschluss()=0
   {//do nothing
   };

einfach nur

   virtual void jahresabschluss()=0;

Auch die Methode Konto::anzeigen sollte rein virtuell sein. Ändern Sie diese Methode entsprechend.

Die Methode auszahlen in der Klasse Konto sollte nur dann eine Auszahlung machen, wenn dies erlaubt ist.

   void auszahlen(double auszahlung)
   {
      if(darfAuszahlen(auszahlung))
         kontostand-=auszahlung;
      else
         cout<<"Auszahlung nicht moeglich!\n";
   };

Die hier angenommene Methode darfAuszahlen ist natürlich wieder rein virtuell, denn die Klasse Konto kann alleine nicht entscheiden, ob eine Auszahlung möglich ist. Das müssen die Unterklassen Girokonto und Sparkonto erledigen.

Übung

Vervollständigen Sie die Klassen Konto und Girokonto und erstellen Sie eine dazu passende Klasse Sparkonto. Das Sparkonto soll zum Jahresabschluß 10% Zinsen auf den aktuellen Kontostand geben. Das folgende Programm soll damit fehlerfrei laufen:

void main()
{
   Girokonto g;
   g.einzahlen(10);
   g.jahresabschluss();
   g.auszahlen(1000);
   g.auszahlen(100);
   g.anzeigen();

   Sparkonto s;
   s.einzahlen(200);
   s.jahresabschluss();
   s.auszahlen(1000);
   s.auszahlen(100);
   s.anzeigen();
};

Die korrekte Ausgabe lautet:

Auszahlung nicht moeglich!
Kontostand: -120
Ueberziehungsrahmen: 1000
Auszahlung nicht moeglich!
Kontostand: 120
Zinssatz: 10

Einsendungen:

Lösung


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