Programmieren mit C++

Allgemeines

Objekt Orientierte Programmierung

Virtuelle Memberfunktionen

Was ist eine virtuelle Memberfunktion?

Frage

Eine virtuelle Funktion erlaubt einer abgeleiteten Klasse, die gleichnamige Funktion einer Basisklasse durch eine neue Implementation zu ersetzen. Der Compiler stellt sicher, daß stets die Funktion der abgeleiteten Klasse aufgerufen wird, selbst dann, wenn das Objekt über einen Basisklassenzeiger adressiert wird.

Virtuelle Member erlauben, Algorithmen in abgeleiteten Klassen zu überschreiben, auch ohne daß der Benutzer der Klasse dies bemerkt. Innerhalb der überschriebenen Methode kann jederzeit die Methode der Basisklasse aufgerufen werden.

Lösung

Wie erreicht C++ dynamisches Binden bei gleichzeitiger statischer Typenüberprüfung?

Frage

Beides ist auseinanderzuhalten. Wenn man einen Zeiger besitzt, so gibt es zwei Typen zu beachten:

  • zum einen den statischen Typ des Zeigers und zum anderen
  • den dynamischen Typ des referenzierten Objekts, auf das der Zeiger zeigt.

Statische Typenüberprüfung meint hier, daß die Zulässigkeit des Aufrufs auf Basis des statischen Types des Zeigers geprüft wird. Wenn dieser Zeigertyp auf die referenzierte Memberfunktion verweisen kann, dann kommt das Objekt, auf das verwiesen wird, damit ebenfalls klar.

Dynamisches Binden hingegen meint, daß der Code auf Basis des dynamischen Types des referenzierten Objekts aufgerufen wird.

Auf gut deutsch: die dynamische Bindung wählt zur Laufzeit den aufzurufenden Code aus und die statische Typenüberprüfung stellt sicher, daß alles, was da automatisch aufgerufen werden könnte, vom richtigen Typ ist.

Lösung

Was ist passiert, wenn der Compiler meldet: "Warning: Derived::f(int) hides Base::f(float)"?

Frage

Wenn diese Warnung auftaucht, dann hat man etwas durcheinandergemengt, das der Compiler nicht mehr ordnen kann. Typischerweise ist folgendes passiert: Die abgeleitete Klasse definiert eine Funktion f(), die auch in der Basisklasse enthalten ist, jedoch mit anderen Parametertypen. In diesem Fall wird die Funktion der Basisklasse nicht überladen oder überschrieben, sondern schlichtweg versteckt, weil die abgeleitete Klasse die Funktion neu definiert.

Als Ausweg bietet es sich an, daß die abgeleitete Klasse die versteckte Funktion redefiniert, indem ggfs. die redefinierte Funktion die der Basisklasse aufruft:

 class Base {
 public:
   void f(int);
 };
 
 class Derived : public Base {
 public:
   void f(double);        // der Übeltäter!
   void f(int i) { Base::f(i); }
 };

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:16:02 von textarchiv.alojado.de