Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » FAQ C / C++ (ANSI-Standard) » Polymorphismus, was ist das?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
11.12.2002, 10:42 Uhr
~Schimmel
Gast


Kann mir vielleicht jemand erklären, was Polymorphismus ist und dazu bitte ein Beispiel posten??
Aus meinem C++ Buch werde ich bei diesem Thema nicht ganz schlau und im Netz habe ich bisher auch nicht vernünftiges gefunden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.12.2002, 12:46 Uhr
virtual
Sexiest Bit alive
(Operator)


Polymorphismus heißt soviel viel "Vielgestaltigkeit". Vereinfacht gesagt versteht man darunter, daß ein Objekt in unterschiedlichen Erscheinungsformen auftreten und eine Variable Objekte unterschiedlicher Art aufnehmen kann.
Man kann in C++ zwei verschiedene Formen der Polymorphie finden: Zum einen der Polymorphismus, der bei der Verwendung von Ableiten von Klassen und virtuellen Methoden zum Tragen kommt:
Nehmen wir an, wir haben eine Basisklasse "Figur", die eine allg. Figure beschreibt (zB Kreise, Linien, Rechtecke). Dies Klasse stellt eine Methode namens zeichnen zur Verfügung:

C++:
class Figur
{
public:
     virtual void zeichnen();
};


Um eine Figur zu zeichnen, kann man zB so vorgehen:

C++:
void zeichneEineFigur(Figur& f)
{
    f.zeichnen();
}

Figur f;
zeichneEineFigur(f);


Wie gesagt ist die Klasse Figur eine sehr allg. Klasse, vernutlich würde sie in einem realen Programm keine konkrete Implementierung für die Method zeichnen bereitstellen. Aber wenn man nur eine mehr konkrete Klassen, wie zB Kreis oder Rechteck nimmt, so kann man diese Klasse von Figur ableiten:

C++:
class Kreis: public Figur
{
public:
     virtual void zeichnen() { /*Zeichne eine Kreislinie*/ };
};

class Rechteck: public Figur
{
public:
     virtual void zeichnen() { /*Zeichne ein Rechteck*/ };
};


Um nun Kreis oder Figuren zu zeichenn, kann man obigen Code praktisch komplett recyclen:

C++:
void zeichneEineFigur(Figur& f)
{
    f.zeichnen();
}

[b]Kreis k;
zeichneEineFigur(k);
Rechteck r;
zeichneEineFigur(r);
[/b]


Eigentlich hat sich nur der fett gedruckte Teil geändert, insbesondere die Funktion zeichneEineFigur ist völlig unverändert. Und trotzdem Wird nun ein Rechteck und ein Kreis gezeichnet: Eine Figur (die als Parameter übergeben wird), ist polymorph, weil abgeleitete Klassen ihre eigene Version der Funktion zeichnen bereitstellen. (Beachte: Die Funktion zeichnen ist virtuell, wäre sie da nicht, würde das nicht gehen!)
Für die Funktion zeichneEineFigur ist mit anderen Worten nur entscheidend, daß eine Figur die Methode zeichnen hat. WElche konkrete Methode nun aufgerufen wird, das ängt davon ab, ob ein Kreis, ein Rechteck oder welche Figur auch immer aufgerufen wird. Im Prinzip weiß die Routine zeichneEineFigur das erst, wenn sie aufgerufen wird (das ist ist recht spät, weil bei nicht virtuellen Methoden weiss das die Funktion bereits zum Zeitpunkt der compilieren, daher spricht man hier auch von "später Bindung")

Die andere Form des Polymorphismus wird eher als "Überladen" bezeichnet und bedeutet im wesentlichen, daß eine Funktion mit gleichem namen mehrmals deklaraiert werden kann (sie muß sich aber in der Signatur, also den Parametern unterscheiden). zB kann man ja schreiben:

C++:
std::string h("Hallo");
h += " Welt";


Hier ist der Operator "+=" überladen worden, d.h. neben dem Operator

C++:
int& operator += (int, int);


Hat jemand den Operator

C++:
std::string& operator += (std::string&, const std::string&);


bzw. etwas adäquates "erfunden". Hier spielt - solange keine operatoren/Methoden virtuell sind - keine späte Bindung die Rolle, sondern eher die Eigenschaft von C++, unterschiedlichen Typen unterschiedliche Versionen der gleichen Funktion zur Verfügung zu stellen.
Hätte man beim dem Figurbeispiel auf späte Bindung verzichtet (was man nicht tun sollte), dann hätte man ebensogut weitere zeichneEineFigur Routinen schreiben können:

C++:
void zeichneEineFigur(Kreis& k);
void zeichneEineFigur(Rechteck& r);


Das wäre dann ein Polymorphismus mit führer Bindung, was aber in den meistens Fällen eher unflexibel und wartungsaufwendig ist, weil man dann für jede Klasse, die von Figur ableitet, eine eigene zeichneEineFigur Routine erfinden müsste.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 11.12.2002 um 12:48 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ FAQ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: