C-Programmierung

Virtuelle Methoden

Polymorphie | | Pure Virtual

Zusätzlich zu regulären Methoden, gibt es auch virtuelle Methoden, die erst in einer Ableitung näher spezifiziert werden sollen. Weil sie aus Sicht der Basisklasse noch nicht endgültig definiert sind, sind sie virtuell.

Durch Voranstellen des SchlĂĽsselwortes virtual wird eine Methode virtuell.

Bei polymorphen regulären Methoden bestimmt der Klassentyp oder der Typ einer Objektreferenz die Auswahl der aufgerufenen Methode.

Im Gegensatz dazu bestimmt bei virtuellen Methoden nicht der Typ einer Objektreferenz die aufgerufene Methode, sondern der tatsächliche Typ des referenzierten Objektes, der dynamisch zur Laufzeit bestimmt wird.

Diesen Mechanismus bezeichnet man als dynamische Bindung oder späte Bindung bzw. runtime-dispatch.

Dies dient u.a. dazu, die zu implementierenden Methoden eines Interfaces zu spezifizieren.

Beispiel zur dynamischen Bindung:

class BaseClass
{
   BaseClass() {}
   virtual ~BaseClass() {}

   void print() { printf("A"); }
   virtual void vprint() { printf("A"); }
};

class DerivedClass : public BaseClass
{
   void print() { printf("B"); }
   virtual void vprint() { printf("B"); }
};

BaseClass a;
DerivedClass b;

BaseClass *p = &a;
p->print(); // --> Ausgabe "A"
p->vprint(); // --> Ausgabe "A"

BaseClass *p = &b;
p->print(); // --> Ausgabe "A"
p->vprint(); // --> Ausgabe "B"

Besonderheiten bei virtuellen Methoden:

  • Konstruktoren dĂĽrfen nicht virtuell sein, da jede Klasse einen eigenen Konstruktor besitzen muss.
  • Destruktoren sollten virtuell sein, wenn die Klasse mindestens eine virtuelle Methode aufweist.

Q Wieso sollten Destruktoren virtuell sein?

Andernfalls wird bei einem abgeleiteten Objekt der falsche Destruktor benutzt, d.h. der Basisdestruktor wird aufgerufen und nicht der abgeleitete Destruktor.

Nebenbemerkung: virtuelle Methoden werden über eine sogenannte vtable realisiert. Dies ist eine Tabelle mit Funktionszeigern für jede virtuelle Methode. Jedes Objekt besitzt eine eigene vtable. Dies erhöht sowohl den Speicherverbrauch als auch die Laufzeitkosten.

Polymorphie | | Pure Virtual

Options: