annA: Späte Bindung in C++

Hallo zusammen,

ich lese gerade "OOP für Dummies". Dort wird die späte Bindung
in C++ erklärt. Leider verstehe ich das nicht so ganz.
Was ist das besondere daran und vorallem: wofür kann ich es
einsetzen.

Viele Grüße
annA

hier das Beispiel aus dem Buch...:

#include <iostream>
using namespace std;

class A
{
public:
   virtual void doSomething(int Value)
   {
      cout << "wir sind in A: " << Value << endl;
   }
};

class B : public A
{
public:
   virtual void doSomething(int Value)
   {
      cout << "wir sind in B: " << Value << endl;
   }
};

int main()
{
   A objectA;
   B objectB;

A* pA;

pA = &objectA;
   pA->doSomething(999);
   pA = &objectB;
   pA->doSomething(123);
   return 0;
}

  1. Hallo,

    ich lese gerade "OOP für Dummies". Dort wird die späte Bindung
    in C++ erklärt. Leider verstehe ich das nicht so ganz.
    Was ist das besondere daran und vorallem: wofür kann ich es
    einsetzen.

    Normalerweise werden bei Methodenaufrufen bereits beim Übersetzen die aufzurufenden Methoden bestimmt und fest im übersetzten Code eingetragen. Späte Bindung bedeutet, daß die aufzurufende Methode erst zur Laufzeit bestimmt wird.
    Verwendung findet das Ganze u.a., wenn man mit verschiedenen Objekten arbeitet, die aber alle von einer Basisklasse abgeleitet wurden.

    Klassisches Beispiel sind Grafikelemente:
    Sagen wir einmal es gibt eine Klasse namens GraphicElement, die u.a eine Methode namens draw() bereitstellt.

    Von dieser Klasse sind dann die Klassen Circle, Rectangle, Polygon abgeleitet, die alle eigene Implementierungen von draw() besitzen, da ja jede geometrische Form anders zu zeichnen ist.

    In Deinem Programm hast Du irgendwo alle möglichen grafischen Elemente erzeugt, die Du in einem Liste aus GraphicElement (GraphicElementList) verwalten willst. Beim Neuzeichnen rufst Du dann für jedes Element in dieser Liste die draw()-Methode auf.

    GraphicElementList Elements;

    Elements.Add(new Circle());
    Elements.Add(new Rectangle());
    Elements.Add(new Polygon());
    Elements.Add(new Circle());
    Elements.Add(new Circle());
    Elements.Add(new Rectangle());

    for(i=0; i< Elements.Count;i++)
       Elemnts[i]->draw();

    Würde draw() nicht so deklariert sein, daß eine späte Bindung erfolgt, so würde beim Neuzeichnen immer die Methode aus der Basisklasse (GraphicElement) aufgerufen werden, was allerdinsg nicht das gewünschte Resultat bringen würde. Mit einer späten Bindung ermittelt das Laufzeitsystem die Methode der Klasse, welche beim Erzeugen von Elements[i] wirklich verwendet wurde, beim ersten Element also die von Circle, beim zweiten die von Rectangle usw., und führt sie dann aus.

    Ich hoffe, etwas Licht in die Sache gebracht zu haben.

    Grüße
      Klaus

    1. Hi Klaus,

      super, vielen Dank!!!
      Brauche eben manchmal logische Beispiele wie Deines :o)
      *freu*

      Schönen Tag und ein noch schöneres Wochenende

      Viele Grüße
      annA