Abstrakte Klassen

Aus RAD Studio
Wechseln zu: Navigation, Suche

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 {       // abstract class
    point center;
    // …
public:
    where() { return center; }
    move(point p) { center = p; draw(); }
    virtual void rotate(int) = 0; // pure virtual function
    virtual void draw() = 0;      // pure virtual function
    virtual void hilite() = 0;    // pure virtual function
    // …
}

shape x;            // ERROR: attempt to create an object of an abstract class
shape* sptr;        // pointer to abstract class is OK
shape f();          // ERROR: abstract class cannot be a return type
int g(shape s);     // ERROR: abstract class cannot be a function argument type
shape& h(shape&);   // reference to abstract class as return
                    // value or function argument is 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 derived from abstract class
    int radius;// private
public:
    void rotate(int) { }  // virtual function defined: no action
                          //  to rotate a circle
    void draw();  // circle::draw must be defined somewhere
}

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.

Siehe auch