Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Polymorphismus for Dummys

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
14.07.2003, 18:58 Uhr
MeisterB



Könntemal bitte jemand an einem Beispiel Polymorphismus erklären?(Soviel wie ich bisher weiß ist es doch "nur" dazu da Funktionen die mit einem bestimmten Wert aufgerufen werden an die richtige Klasse zu senden oder)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.07.2003, 19:09 Uhr
0xdeadbeef
Gott
(Operator)


Polymorphismus bezeichnet ein Verfahren, dass es ermöglicht, mehrere gleichnamige Funktionen zu haben. Diese unterscheiden sich durch die Parameterliste - ein Beispiel wäre

C++:
class Bruch {
    //...
    void add(const Bruch& );
    void add(int );
};


je nachdem, mit welchem Parameter die Methode Bruch::add aufgerufen wird, wird der entsprechende Code ausgeführt. Möglich, aber nur in Ausnahmefällen sinnvoll ist auch, verschiedene Rückgabetypen anzugeben. Allerdings muss die Parameterliste verschieden sein. Legal ist also

C++:
class Bruch {
    //...
    void add(const Bruch& );
    int add(int );
};


aber das hier:

C++:
class Bruch {
    //...
    void add(const Bruch& );
    int add(const Bruch& ); //gleiche Parameterliste
};


geht nicht. Der Compiler hätte keinen Anhaltspunkt, welche Methode er eigentlich nehmen soll.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 14.07.2003 um 19:10 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.07.2003, 20:41 Uhr
~wissender
Gast


Äh, was du hier beschreibst ist meines Wissen einfach Überladen von Funktionen, oder nicht?
Polymorphismus meint doch eigentlich, das auf Vererbung basierend immer die richtige Funktion aufgerufen wird.
Will heißen, wenn man einem Object von Typ der Basisklasse mit einem Typ der abgeleiteten Klassen initialisiert und diese abgeleitete Klasse hat einen Funktion mit gleichnamiger Signatur wird diese aufgerufen und nicht die der eigentlich Basisklasse (virtual nicht vergessen).
So habe ich das eigentlich immer verstanden...

Gruss
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.07.2003, 20:48 Uhr
0xdeadbeef
Gott
(Operator)


Halb, halb. Du hast insofern recht, als das virtuelle Funktionen auch eine Art von Polymorphismus ist, für das Überladen von Funktionen gilt das aber genauso. Mea culpa, da hab ich wohl was vergessen...
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.07.2003, 21:38 Uhr
Spacelord
Hoffnungsloser Fall


Ganz streng gesehen ist Überladung keine Form echter Polymorphie.
Wohl aber Subtyp-Polymorphie und Parametrische-Polymorphie.
Irgendwie fällt Überladung aber trotzdem darunter .

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.07.2003, 14:55 Uhr
~StefanD
Gast


Meint ihr das ernst? Wo kommen denn diese Begriffe ("Subtyp-Polymorphie" und "Parametrische-Polymorphie") her? Die hab ich noch nie gehört.

Ich kenne Polymorphie nur so, wie wissender sie erklärt. Ehrlich gesagt, finde ich es auch nicht nachvollziehbar, das Überladen von Methoden als Polymorohie zu bezeichnen. Was ist an einer solchen Klasse polymorph?


Stefan.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.07.2003, 15:53 Uhr
virtual
Sexiest Bit alive
(Operator)


Oh, diesen interessanten thread hab ich ja ganz aus den Augen verloren .

Ich würde mich auch zur Fraktion StefanD und wissender zuordnen: Polymorphie und Überladen sind zwei verschiedene Dinge.´

Beim Überladen wird im Wesentlichen dem Programmierer einfach nur die Last abgenommen, sich jedesmal neue Methoden/funktionsnamen auszudenken. Überladen funktioniert auch unabh. von Klassen (im Gegensatz zur Polymorphie). Während ein C Programmierer schreiben müsste:

C++:
char* int_zahl_zu_string(int z) { /* Konvertiere int in einen string */ };
char* float_zahl_zu_string(float z) { /* Konvertiere float in einen string */ };


Ist es einem C++ Programmierer Erlaubt zu schreiben:

C++:
char* zahl_zu_string(int z) { /* Konvertiere int in einen string */ };
char* zahl_zu_string(float z) { /* Konvertiere float in einen string */ };


Dh. in C++ ist neben dem Funktionsnamen auch die Parameterliste dafür verantwortlich, daß das die richtige routine aufgerufen wird. In der letzteren Variante kann man sich problemlos auch noch vorstellen, daß die Funktionen innerhalb einer Klasse deklariert wurden: die Parameter entscheiden, welche Funktion aufgerufen werden.

Polymorphie arbeitet anders. Hier erst mal ein nicht polymorphes Beispiel:

C++:
class base
{
....
public:
     void f() { std::cout<<"base::f()"<<std::endl; }
};
class derived:public base
{
....
public:
     void f() { std::cout<<"derived::f()"<<std::endl; }
};

void g(base& a)
{
    a.f();
}

int main()
{
   base x;
   derived y;
   g(x);
   g(y);
}


Dieses Programm würde ausgeben:

Code:
base::f()
base::f()


An g wird ein Objekt eine variable des Types base übergeben und - da die Methode nicht polymorph ist - wird auch immer base::f() aufgerufen, und das, obwohl wir uns die Mühe gemacht haben, diese Method zu überschreiben! Polymorph wird das ganze durch das C++ Schlüsselwort virtual (nicht zu verwechseln mit mir! ):

C++:
class base
{
....
public:
     [b]virtual[/b] void f() { std::cout<<"base::f()"<<std::endl; }
};
...


Nun ist die Methode virtuell, dh. es ist nicht der formale Typ in der Parameterliste von g davon abhängig, welche Version aufgerufen wird, sondern der aktuelle typ. Die ausgabe wäre "plötzlich":

Code:
base::f()
derived::f()


Funktionen kann man mithin nicht virtuell machen, wohl aber kann man virtuelle Methoden zusätzlich noch überladen.
Es gibt jedoch einige Schüße ins Bein, die man sich so antun kann:
Obiges Beipiel würde zB nicht funktionieren, wenn g(base& a) nicht eine Referenz (oder alternativ Pointer) übergeben würde, sondern ein Call By Value gemacht würde:

C++:
g(base a)


Dann kann man virtual verwenden, soviel man lustig ist, es würde sich nicht polymorph verhalten. (Der Grund ist einfach: beim Aufruf von g würde der Copyconstructor von base aufgerufen, welcher eben auch nur ein base-Objekt erzeugt. Selbst wenn ein derived-Objekt übergeben würde, würde der spezialisierte Teil "verschluckt").
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.07.2003, 15:56 Uhr
Spacelord
Hoffnungsloser Fall


Überladen nennt sich ad-hoc Polymorhie und ist wie bereits erwähnt keine echte Form der Polymorphie!
@StefanD:
Wenn die Bergriffe dir nichts sagen empfehle ich Google zu nutzen anstatt hier
zu fragen ob dass unser Ernst ist!

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: