Bedeutet das in erster linie das man zb in einem Container Adressen von Objekten speichert und sie dann über eine Iterator ausgeben kann bei uns in der Vorlesung polymorphe extremst mit Zeigern verküpft
Polymorphie ist eine Art der Klassenableitung. Wenn du in einer Klasse einen Zeiger anlegst, der auf eine zweites Objekt zeigt, dann ist das keine Vererbung, sondern Aggregation.
Vorsicht: ich bin auch erst im 3 Semester E-Technik hab also selber nicht besonders viel Ahnung von Programmiersprachen Eigentlich ist die Polymorphie (griechisch πολυμορφία, „die Vielgestaltigkeit“) im Kern die Vererbung. Also abgeleitete Klassen erben die Funktionen/Methoden der Basisklasse. Was hat das mit Zeigerarithmetik zu tun? Ansonsten : http://de.wikipedia.org/wiki/Polymorphie_(Programmierung)
Polymorphie kann in C++ tatsächlich nur mit Pointern oder Referenzen und Funktionsaufrufen eingesetzt werden. Polymorphie bedeutet, dass erst zur Laufzeit bestimmt wird, welche Funktion tatsächlich aufzurufen ist, wenn ein Funktionsaufruf über einen Basisklassenpointer gemacht wird. Dies steht im krassen Gegensatz zu einem nichtpolymorphen Funktionsaufruf, bei dem schon während des Compilierens exakt feststeht, welche Funktion eines Objektes aufgerufen werden muss. Bsp
1 | class Animal |
2 | {
|
3 | public:
|
4 | virtual void speak() { cout << "Don't know how to speak\n"; } |
5 | };
|
6 | |
7 | class Cat : public Animal |
8 | {
|
9 | public:
|
10 | virtual void speak() { cout << "Miau\n"; } |
11 | };
|
12 | |
13 | class Dog : public Animal |
14 | {
|
15 | public:
|
16 | virtual void speak() { cout << "Wuuf\n"; } |
17 | }
|
18 | |
19 | void makeItSpeak( Animal* pet ) |
20 | {
|
21 | pet->speak(); |
22 | }
|
23 | |
24 | int main() |
25 | {
|
26 | Dog Herkules; |
27 | Cat Minka; |
28 | |
29 | makeItSpeak( &Herkules ); |
30 | makeItSpeak( &Minka ); |
31 | }
|
In der Funktion makeItSpeak ist alles was der Funktion zur Verfügung steht ein Pointer auf ein Animal Objekt. Würde der speak-Aufruf nicht-polymorph erfolgen, so würde Animal::speak() aufgerufen werden. Da es sich aber um eine virtuelle Funktion handelt, wird die Bestimmung der tatsächlich aufzurufenden Funktion solange verzögert, bis zur Laufzeit des Programms feststeht ob es sich bei pet um einen Pointer auf ein Dog oder ein Cat Objekt handelt, und die jeweils richtige Memberfunktion dafür aufgerufen. Von Polymorphie spricht man daher deshalb, weil es so aussieht, als ob sich der Pointer pet vom Datentyp "Pointer auf Basisklasse" in den jeweils richtigen Datentyp-Pointer einer abgeleiteten Klasse verwandeln kann (was er in Wirklichkeit aber so nicht tut). Der Pointer vereint daher mehrere (poly) Erscheinungsformen in sich, in die er sich bei Bedarf während des Funktionsaufrufs verwandelt (to morph: sich verwandeln)
Polymorphie bedeutet Vielgestaltigkeit. Stell Dir vor Du hast ein Malprogramm mit Kreisen, Rechtecken etc. Dazu gibt es Funktionen (Methoden) wie z.B. berechneUmfang(). Diese wird natürlich bei einem Kreis ein anderes Ergebnis bringen als bei einem Rechteck. Man weiß aber erst zur Laufzeit, auf was für ein Objekt diese Methode aufgerufen wird, denn man weiß ja nicht im voraus welche und wieviele Objekte der Benutzer anlegen wird. Der Typ des Objekts bestimmt also den Methodenaufruf, dies wird durch das in C++ so genannte "späte Binden" erreicht.
Sven P. schrieb:
> Polymorphie ist eine Art der Klassenableitung.
Eigentlich nicht.
Vererbung nennt man Inheritance.
Sagen wir so, ohne Vererbung (die gemeinsame Basisklasse) gibt es auch keine Polymorphie.
Matthias Keller schrieb: > Eigentlich ist die Polymorphie (griechisch πολυμορφία, „die > Vielgestaltigkeit“) im Kern die Vererbung. Also abgeleitete Klassen > erben die Funktionen/Methoden der Basisklasse. Das hat mit Polymorphie nicht allzuviel zu tun. Man könnte höchstens sagen, dass eine der Voraussetzungen für Polymorphie darin besteht, dass die Basisklasse eine Funktionssignatur definiert, die von der erbenden Klasse überschrieben werden muss. Aber mit dem was man gemeinhin unter "Erben einer Funktion/Methode" versteht, hat das recht wenig zu tun.
#include <iostream> #include <list> #include <cassert> #include <stdexcept> using namespace std; class A { public: virtual void showdaten() = 0; }; class C { public:void speichere(A *f) { cont.push_front(f); } void show() { list<A *>::iterator it; for (it = cont.begin(); it != cont.end (); it++) { (*it)->showdaten(); } } private: list <A *> cont; }; class D : public A { public: D(C *aa){cc = aa;} void meldean(){cc->speichere(this);} virtual void showdaten(){cout << "D" << endl;} private: C *cc; }; class E : public A { public: E(C *aa){cc = aa;} void meldean(){cc->speichere(this);} virtual void showdaten(){cout << "E" << endl;} private: C *cc; }; int main(void) { C uu; D d(&uu); D a(&uu); E r(&uu); E u(&uu); d.meldean(); a.meldean(); r.meldean(); u.meldean(); uu.show(); return 0; } hier hab ich ein Beispiel da werden im Container list Adressen gespeichet nachdem sich die Klassen angemeldet haben
> Sagen wir so, ohne Vererbung (die gemeinsame Basisklasse) gibt es auch > keine Polymorphie. Gegenbeispiel: das klassische Visual Basic. Kennt keine Vererbung, aber Polymorphie.
Interpretierte Sprachen haben natürlich inhärent Polymorphie, weil die Programme erst zur Laufzeit ausgewertet werden. So gesehen hat meine Shell (bash) auch Polymorphie. Der Thread und damit die Aussage von Mark Brandis bezieht sich wohl auf C++.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.