Polymorphismus
-
Das hat ja grundsätzlich nicht nur was mit C++ zu tun, aber da du hier postest, denke ich willst du darauf hinaus das in C++ zu erklären. Wenn du dir mal die Unterschiede, Vor/Nachteile von templates und virtuellen Funktionen überlegst, dann siehst du eigentlich, wo die grossen Unterschiede sind und dann sollte das recht leicht zu eklären sein.
Du kannst dir Fragen überlegen, wie
- Wann findet die Auswahl statt, welche Funktion aufgerufen wird
- Performance Einbussen
- Erweiterbarkeit für Benutzer
- Abhängigkeiten (durch Vererbung z.B)
- ...
Wenn du dir Gedanken über diese Punkte (und vielleicht noch andere) machst, dann wirst du das jedem recht gut erkären können. Das setzt natürlich voraus, dass du dich mit den beiden Techniken auskennst. Wenn nicht, dann musst du zuerst mal die Antworten auf die obigen Fragen finden, was du durch gute Bücher tun kannst.
und jz erwartest du von uns, dass wir hier polymorphismus komplett beschreiben?
Ich habe die Frage nicht so verstanden.

-
also das hab ich bisher verstanden:
also unter statische poloymorphie verstehe ich folgendes:
- das überladen von funktionen, man hat also mehrere funktionsnahmen mit unterschiedlichen parametern,
wenn man nun im code eine funktion aufruft, weißt der compiler zur compilzeit welche funktion aufgerufen wird
- templates haben auch eine art statische polymorphie...aber wie genau?dynamische polymorphie wird immer in bezug auf vererbung definiert:
- wenn man in der basisklasse eine funktion: foo definiert, und das auch in der davon abgeleiteten child klasse,
wird diese funktion also überschrieben. man wenn man einer funktion die ein basis klassen objekt als pointer haben
will, die adresse des child objektes übergibt, wird immer die funktion foo der basisklasse aufgerufen wird.
wenn man nun aber die funktion der basisklasse als virtual definiert, legt der compiler ein vtable an.
der compiler weiß er kann zur compilezeit nicht auswerten welche funktion aufgerufen wird. es muss also zur
laufzeit passieren. das übergebene objekt das sich hinter dem pointer befindet prüft also selbst welche funktion es aufrufen muss, entweder die funktion
foo der basisklasse oder die funktion foo der child klasse. stimmt das so ca.?
-
Ja. Das kommt eigentlich hin.
templates generieren dir zur Laufzeit sogar die Funktion, die aufgerufen wird anhand des Typen, den du angibst.
-
> templates generieren dir zur Laufzeit sogar die Funktion, die aufgerufen wird anhand des Typen, den du angibst.
Echt? Ich dachte, dass der Objektcode mit dem jeweilig eingesetzten Typen zur Kompilier-Zeit erstellt wird?!

-
wie kann ich den zusammenhang zwischen templates und statischer polymorphie erklären? templates werden ja immer zur compilezeit definiert!?
das problem mit dynamischer polymorphie habe ich nun mit objekten beschrieben, wo ich die adresse für einen pointer der basisklasse übergebe. weil der compiler immer den typ des pointers nimmt (und nicht das objekt analysiert, welches sich hinter dem pointer befindet), um die funktion aufzurufen. Ist das so ok?
cu
-
Ad aCTa schrieb:
> templates generieren dir zur Laufzeit sogar die Funktion, die aufgerufen wird anhand des Typen, den du angibst.
Echt? Ich dachte, dass der Objektcode mit dem jeweilig eingesetzten Typen zur Kompilier-Zeit erstellt wird?!

Hmpf. Natürlich meinte ich da zur Kompilierzeit und nicht zur Laufzeit.
das problem mit dynamischer polymorphie habe ich nun mit objekten beschrieben, wo ich die adresse für einen pointer der basisklasse übergebe. weil der compiler immer den typ des pointers nimmt (und nicht das objekt analysiert, welches sich hinter dem pointer befindet), um die funktion aufzurufen. Ist das so ok?
Der Compiler weiss bei dynamischer Polymorphie nicht von welchem Typ das Objekt sein wird, sondern der Typ wird dynamisch an den Zeiger gebunden. Der Compiler weiss lediglich, welche Typen an den Zeiger gebunden werden können. Der Tatsächliche Typ ist erst zur Laufzeit bekannt und kann auch erst dann ermittelt werden. Das geht ja noch weiter, dass von einer Zeile zur anderen der gebundene Typ sich ändern kann.
-
Das geht ja noch weiter, dass von einer Zeile zur anderen der gebundene Typ sich ändern kann.
wie soll das denn gehn? hast ein bsp?
cu
-
void bar (base** b) { *b = new A; } void foo () { base* b = new B; // gebundener Typ B bar ( b ); // hier auch noch b->foobar (); // hier bereits Typ A }
-
jayz schrieb:
wie soll das denn gehn? hast ein bsp?
class Base {}; // sei Base polymorph class Derived : public Base {}; int main() { Base b; Derived d; Base* p = &b; // dynamischer Typ Base p = &d; // dynamischer Typ Derived }
-
welche anwendungen hat dynamische polymorphie genau?
cu
-
jayz schrieb:
welche anwendungen hat dynamische polymorphie genau?
Sie ist ein wichtiges Konzept zur Abstraktion in der objektorientierten Programmierung. Durch virtuelle Funktionen kann man Zeiger/Referenzen auf Instanzen einer Basisklasse besitzen, hinter denen sich aber auch abgeleitete Klassen befinden können. In der Basisklasse existiert eine gemeinsame Schnittstelle für Aufgaben, welche in abgeleiteten Klassen spezialisiert werden. Auf diese Weise kann man unterschiedliche Objekte einheitlich ansprechen, und je nach Klassenzugehörigkeit wird eine andere, auf das jeweilige Objekt angepasste, Aufgabe durchgeführt.
-
wo findet man das, in gui frameworks?
-
jayz schrieb:
wo findet man das, in gui frameworks?
Unter anderem. Aber Laufzeitpolymorphie ist ein Sprachkonzept und als solches nahezu überall anwendbar. Ich verwende es selber recht oft -- eben dort, wo die erwähnte Abstraktion benötigt wird.