Gast
#1312298
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
|
Anzeige
|
Was bedeutet polymorphe in C++
Gast
#1312298
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
Gast
#1312310
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
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.
Gast
#1312425
#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
Gast
#1316119
> 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++. Ha jo. Und bleib mer weg mim Basic Dreck. ;-) Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|