Konkrete und abstrakte Klassen

Die bisher vorgestellten Klassen sind alle konkret; das heißt man kann von diesem Typ auch Objekte erzeugen (als Variablen oder mit new).

Es kann allerdings wünschenswert sein, eine Klasse zu schaffen, die ausschließlich zum Ableiten verwendet werden kann, ohne daß von der Basisklasse Objekte erzeugt werden können. Die obige Beispielklasse Fahrzeug wäre ein Kandidat dafür; denn außer einen Namen zu speichern kann die Klasse nichts weiter tun. Erst mit den Ableitungen erwacht die Klasse zu Leben.

In einem solchen Fall kann man eine abstrakte Klasse erzeugen, indem man mindestens eine der virtuellen Funktionen ,,totlegt``. Das geschieht für mindestens eine virtuelle Funktion durch Zuweisen eines Nullwerts an die vtable, anstatt die Funktion zu definieren:

class Fahrzeug
{
/...
  virtual void zeigdich() const = 0;
/...

Eine solche Methode heißt pure virtual function

Jetzt können keine Fahrzeug-Objekte mehr erzeugt werden, allerdings kann man von der Klasse weitere ableiten. Falls diese alle in der Basisklasse als pure virtual deklarierten Methoden mit einer echten Definition überschreiben, dann sind sie konkret und man kann davon Objekte erzeugen.

Eine abstract base class heißt gelegentlich auch ABC. Ein Javaprogrammierer kann sie auch Schnittstelle nennen und so nutzen; man hat aber die Möglichkeit, mehr Funktionalität darin unterzubringen als dies in Java in einer Schnittstelle möglich wäre (insbesondere nichtkonstante Daten und vollständige Funktionsdefinitionen).

AnyWare@Wachtler.de