Programmieren mit C++

Allgemeines

Objekt Orientierte Programmierung

Virtuelle Konstruktoren und Destruktoren

Was ist ein virtueller Konstruktor?

Frage

Hierbei handelt es sich um ein Idiom, das etwas erlaubt, was normalerweise von C++ nicht direkt unterstützt wird.

Den Effekt eines virtuellen Konstruktors erhält man durch eine virtuelle createCopy() Memberfunktion für einen Kopierkonstruktor oder eine virtuelle createSimilar() Memberfunktion für den Defaultkonstruktor. Ausgehend von der folgenden Basisklasse

Lösung

 class Shape {
 public:
   virtual ~Shape() { }
   virtual void draw() = 0;
   virtual void move() = 0;
   //...
   virtual Shape* createCopy() const = 0;
   virtual Shape* createSimilar() const = 0;
 };

wird die nachfolgende Ableitung gebildet

Basisklasse

 class Circle : public Shape {
 public:
   Circle* createCopy()    const 
     { return new Circle(*this); }
   Circle* createSimilar() const 
     { return new Circle(); }
   //...
 };

Der Aufruf von Circle(*this) ist der eines Kopierkonstruktors. createSimilar() ist ähnlich, erzeugt jedoch einen „Default“ Circle.

Anwender der Klasse nutzen diese als wenn es virtuelle Konstruktoren wären:

 void userCode(Shape& s)
 {
   Shape* s2 = s.createCopy();
   Shape* s3 = s.createSimilar();
   //...
   delete s2;
   delete s3;
 }

Diese Funktion arbeitet korrekt unabhängig davon, ob es sich bei Shape um ein Circle, Square oder sonst etwas handelt.

Abgeleitete Klasse

Wann sollte mein Destruktor virtuell sein?

Frage

Ein Destruktor sollte dann virtuell sein, wenn ein abgeleitetes Objekt über einen Basiszeiger per „delete“ zerstört werden soll.

Virtuelle Funktionen binden den Code der Klasse des Objekts ein, nicht den der Klasse, dessen Typ der Zeiger gerade hat. Besitzt die Klasse base einen virtuellen Destruktor, so verwendet die Anweisung „delete basePtr“ den Destruktor, der mit dem Typ des Objekts *basePtr verbunden ist und nicht den der Basisklasse.

Lösung





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-22 08:15:36 von textarchiv.alojado.de