Abstrakte Klassen
Nach oben zu Polymorphe Klassen - Index
Eine abstrakte Klasse ist eine Klasse mit mindestens einer abstrakten virtual-Funktion. Eine virtual-Funktion wird zu einer abstrakten Funktion, indem sie auf Null gesetzt wird.
Eine abstrakte Klasse kann nur als eine Basisklasse für andere Klassen verwendet werden. Es ist nicht möglich, Objekte einer abstrakten Klasse zu generieren. Eine abstrakte Klasse kann nicht als Argumenttyp oder Funktionsrückgabetyp verwendet werden. Es ist jedoch möglich, Zeiger auf eine abstrakte Klasse zu deklarieren. Wenn zur Initialisierung kein temporäres Objekt benötigt wird, sind auch Referenzen auf eine abstrakte Klasse erlaubt. Zum Beispiel:
class shape { // abstrakte Klasse point center; . . . public: where() { return center; } move(point p) { center = p; draw(); } virtual void rotate(int) = 0; // abstrakte virtuelle Funktion virtual void draw() = 0; // abstrakte virtuelle Funktion virtual void hilite() = 0; // abstrakte virtuelle Funktion . . . } shape x;// FEHLER: Versuch, ein Objekt einer abstrakten Klasse zu erstellen shape* sptr; // Zeiger auf abstrakte Klasse ist zulässig shape f();// FEHLER: Abstrakte Klasse kann kein Rückgabetyp sein int g(shape s);// FEHLER: Abstrakte Klasse kann kein Funkionsargumenttyp sein shape& h(shape&);// Referenz auf abstrakte Klasse als Rückgabewert // oder Funktionsargument ist OK
Nehmen wir an, D sei eine abgeleitete Klasse mit der abstrakten Klasse B als unmittelbarer Basisklasse, die eine abstrakte Funktion pvf enthält. Stellt D keine Definition für pvf bereit, wird pvf eine abstrakte Elementfunktion von D, und D wird dadurch zu einer abstrakten Klasse.
Mit der oben eingeführten Klasse shape sieht das folgendermaßen aus:
class circle : public shape {// circle abgeleitet von abstrakter Klasse int radius;// private public: void rotate(int) { }// virtuelle Funktion definiert: zur Rotation des // Kreises wird keine Aktion benötigt. void draw(); // circle::draw muss an anderer Stelle definiert werden }
Elementfunktionen können von einem Konstruktor einer abstrakten Klasse aufgerufen werden. Der direkte oder indirekte Aufruf einer abstrakten Funktion führt jedoch zu einem Laufzeitfehler.