Forum: PC-Programmierung Was bedeutet polymorphe in C++


von Usel (Gast)


Lesenswert?

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

von Sven P. (Gast)


Lesenswert?

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.

von Matthias K. (mkeller)


Lesenswert?

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)

von Karl H. (kbuchegg)


Lesenswert?

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)

von Mark B. (markbrandis)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

Sven P. schrieb:
> Polymorphie ist eine Art der Klassenableitung.

Eigentlich nicht.
Vererbung nennt man Inheritance.

von Mark B. (markbrandis)


Lesenswert?

Sagen wir so, ohne Vererbung (die gemeinsame Basisklasse) gibt es auch 
keine Polymorphie.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Kasan (Gast)


Lesenswert?

#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

von der mechatroniker (Gast)


Lesenswert?

> Sagen wir so, ohne Vererbung (die gemeinsame Basisklasse) gibt es auch
> keine Polymorphie.

Gegenbeispiel: das klassische Visual Basic. Kennt keine Vererbung, aber 
Polymorphie.

von Klaus W. (mfgkw)


Lesenswert?

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++.

von Mark B. (markbrandis)


Lesenswert?

Ha jo.
Und bleib mer weg mim Basic Dreck. ;-)

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
Noch kein Account? Hier anmelden.