mikrocontroller.net

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


Autor: Usel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Keller (mkeller)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
class Animal
{
  public:
    virtual void speak()     { cout << "Don't know how to speak\n"; }
};

class Cat : public Animal
{
  public:
    virtual void speak()    { cout << "Miau\n"; }
};

class Dog : public Animal
{
  public:
    virtual void speak()    { cout << "Wuuf\n"; }
}

void makeItSpeak( Animal* pet )
{
  pet->speak();
}

int main()
{
  Dog Herkules;
  Cat Minka;

  makeItSpeak( &Herkules );
  makeItSpeak( &Minka );
}

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)

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven P. schrieb:
> Polymorphie ist eine Art der Klassenableitung.

Eigentlich nicht.
Vererbung nennt man Inheritance.

Autor: Mark Brandis (markbrandis)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kasan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: der mechatroniker (Gast)
Datum:

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

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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++.

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ha jo.
Und bleib mer weg mim Basic Dreck. ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.