Polymorphismus-Kann mir das jmd erklären?
-
Hi,
ich arbeite mich gerade in C++ ein und bin nun beim Thema Polymorphismus angelangt nur scheinde dass so gar nicht zu verstehen.
Was ich bis jetzt verstanden habe ist,dass zb alle Objekte einer Klasse "beweglich" sich "bewegen" können und jedes auf eine andere Art und deswegen Methoden überschrieben werden.
Trotzdem steh ich auf der Leitung...
Es wäre toll wenn ihr mir helfen könntet
MFG
-
poly = viel
morph = gestaltWas hat das mit beweglich zu tun?
Diese Erklaerung halte ich fuer unsinnig und schwer verstandlich.Etwas was polymorph ist, kann viele verschiedene Gestalten annehmen.
In diesem Falle ist das eine Methode (und damit auch die Klasse).
-
puh lol,
also ich weiss eh was polymorph heisst und das beweglich bezog sich NICHT auf Polymorphismus, aba trotzdem danke
-
Für mich ist das hier Polymorphie:
#include <iostream> using namespace std; class Tier { public: Tier() {} ~Tier() {} virtual void Laut() const {cout << "Tier gibt Laut" << endl;} }; class Maus : public Tier { public: Maus() {} ~Maus() {} void Laut() const {cout << "Pieps pieps" << endl;} }; int main() { Tier *MAUS=new Maus; MAUS->Laut(); delete MAUS; MAUS=0; return 0; }Wenn man auf einem Zeiger der Basisklasse die Adresse von einem Objekt, aus einer mit der Basisklasse verwandten Klasse
übergibt, dann kann man eine Funktion von der Basisklasse in der abgeleiteten Klasse redefinieren, also überschreiben, und diese mit Hilfe des Objekts (MAUS) aufrufen indem man die in der abgeleiteten Klasse redefinierte Funktion in der Basisklasse als virtual deklariert.
Hoff mal das ichs gut formuliert habe und wir vom selben sprechen.
PS: Das Kapitel über Polymorphie hab ich nämlich auch vor zwei Tagen in meinem Buch durchgemacht

-
Ja, sowas fällt auch unter "late binding". D.h. es wird erst später zur Laufzeit entschieden, welche Funktion aufgerufen wird. In Strombergs Beispiel wird erst zur Laufzeit entschieden, ob z.B. die Laut()-Methode von Maus oder einem anderen Tier aufgerufen wird. In Strombergs Bsp. wird das aber leider nicht wirklich klar, weil das Bsp. nicht so toll ist. Besser ist das:
class Tier { public: virtual void Laut() = 0; }; class Maus : public Tier { public: virtual void Laut() { cout << "Maus sagt was" << endl; } }; class Hund : public Tier { public: virtual void Laut() { cout << "Hund sagt was" << endl; } }; void tierSagtWas(Tier &tier) // es ist nur der Typ Tier bekannt!!! { tier.Laut(); } int main() { Maus maus; tierSagtWas(maus); Hund hund; tierSagtWas(hund); }Der Clou ist, das der tier.Laut()-Aufruf zur Laufzeit entscheid, ob Laut() von Hund oder von Maus aufgerufen wird. Late-Binding halt.
Auf der Konsole erscheint:
Maus sagt was Hund sagt wasObwohl ich als Schreiber der Funktion tierSagtWas() nur weiß, das es Tier gibt. Der Benutzer der Funktion kann aber alle Möglichen Tier-Typen übergeben.
Polymorphie hängt also mit Vererbung und late-binding zusammen.
-
Muhi89 schrieb:
Hi,
ich arbeite mich gerade in C++ ein und bin nun beim Thema Polymorphismus angelangt nur scheinde dass so gar nicht zu verstehen.
Was ich bis jetzt verstanden habe ist,dass zb alle Objekte einer Klasse "beweglich" sich "bewegen" können und jedes auf eine andere Art und deswegen Methoden überschrieben werden.
Trotzdem steh ich auf der Leitung...
Es wäre toll wenn ihr mir helfen könntet
MFG
Falls eine Funktion in einer Basisklasse als virtual deklariert wird, und in einer Abgeleiteten Klasse definiert wird, wird sie ausgeführt, wenn ein Zeiger auf ein Objekt der Basisklasse(der ja auch auf ein Objekt einer Abgeleiteten Klasse zeigen darf) zufällig auf ein Objekt jener Abgeleiteten Klasse verweist, für welche die virtuelle Funktion definiert wurde. Und zwar wird jeweils jene Version der virtuellen Funktion aufgerufen, die zu jener Basis- oder Abgeleiteten Klasse quasi 'gehört', auf die der Zeiger zeigt.
Ein Wunder der Technik bzw. des Virtual Function Pointers!
Sehr naheliegend ist eine virtual-Funktion immer dann, wenn zwar feststeht, dass das Objekt auf dem Bildschirm oder sonstwo in irgend einer Form ausgegeben werden können soll, aber noch nicht genau abzuschätzen ist, WIE GENAU diese Ausgabe aussehen soll. Damit behält man sich die Möglichkeit vor, entsprechende Ausgabefunktionen erst in abgeleiteten Klassen zu schreiben, wenn man weiß, welche Bibliotheken man einbinden möchte (DirectX etc).
Virtual sind typischer Weise jene Funktionen, die irgend etwas mit der Ausgabe oder Eingabe eines Objekts über die Hardware zu tun haben. Als Richtschnur.
-
Hallo,
Danke an alle für die verständlichen Bsp-Sources.
Nur das mit der Laufzeit-Bindung hab ich nicht verstanden.
Verstanden hab ich, dass es so dynamisch ist.
Aber imo is LaufzeitBindung zb ne if Anweisung etc.Wie kann ich mir das besser vorstellen?
Mfg
-
Denk doch mal nach!
Laufzeitbindung: Compiler weiss die Adresse der Methode nicht [da sie ja polymorph] ist nicht zur Compilezeit und muss daher zur Laufzeit entscheiden welche er aufruft. Siehe dazu: vtable
-
Man nennt das uach "spätes Binden","Binden zur Laufzeit"....d.h. es ist vor der Kompilierzeit noch gar nicht bekannt welches Objekt erzeugt und dezufolge welche Methoden aufgerufen werden.