polymorphie, auch ohne pointer?



  • hi leute!
    was genau ist polymorphie? ich hab schon gehört das funktioniert auch ohne pointer, kann mir das aber nicht vorstellen!!??? was ist statisch u was dynamische polymorphie? was ist virtual...(viruelle methode) wie hat das mit polymorphie zu tun?

    cu



  • Bitte, lies ein Buch. Du willst zu viel wissen. Viel zu viel. Das wird sich keiner antun.



  • das wollen aber auch glaub ich mal andere leute gerne wissen....
    ja wenn jeder ein bissal an seinem wissen postet dann kommen wir schon zum ziel! cu



  • Dazu steht genügend in einem guten C++ Buch.



  • interpreter schrieb:

    Dazu steht genügend in einem guten C++ Buch.

    Ich glaube das steht sogar in jedem schlechten C++ Buch, wie auch in jedem schlechten Medizinbuch die Wörter "Blut", "Herz" oder "Gehirn" stehen würden.



  • CarstenJ schrieb:

    Ich glaube das steht sogar in jedem schlechten C++ Buch, wie auch in jedem schlechten Medizinbuch die Wörter "Blut", "Herz" oder "Gehirn" stehen würden.

    hehe. In der Tat. 🙂



  • @leader über die formen der polymorphie und ihre einsatzmöglihkeiteen kann man ganze bücher schreiben,und ich bin mir sicher, dass keiner hier lust hat, sich mal eben so ein Buch aus dem ärmel zu schütteln^^



  • was ist statische polymorphie? du willst ja nicht sagen das du da überladen von operatoren meinst?
    was hat das mit später Bindung zu tun?

    bye



  • du willst ja nicht sagen das du da überladen von operatoren meinst?

    nein-.-



  • specher schrieb:

    was ist statische polymorphie? du willst ja nicht sagen das du da überladen von operatoren meinst?
    was hat das mit später Bindung zu tun?

    Och, Operatorenüberladung kann man auch als statische Polymorphie sehen - einige Operatoren sind ja nur Funktionen.

    Aber mit statischer Polymorphie meint man zB sowas:

    //dynamisch:
    class Shape
    {
    public:
      virtual void draw()=0;
    };
    
    class Circle  : public Shape
    {
    public:
      void draw();
    };
    
    class Square : public Shape
    {
    public:
      void draw();
    };
    
    void draw(Shape& shape)
    {
      shape.draw();
    }
    
    //statisch:
    class Circle
    {
    public:
      void draw();
    };
    
    class Square
    {
    public:
      void draw();
    };
    
    template<class Shape>
    void draw(Shape& shape)
    {
      shape.draw();
    }
    


  • Polymorphie heißt für mich folgends: Funktionen die gleiche Namen haben aber eine unterschiedliche Signatur! durch die späte Bindung also zur Laufzeit wird außgewählt welche Funktion genommen wird! Auswahl auf Grund der vtable oder? und ob du da jetzt pointer oder referenzen nimmst is ja egal...unterschiedet sich ja nur zwischen -> u .

    bye



  • Funktionen die gleiche Namen haben aber eine unterschiedliche Signatur! durch die späte Bindung also zur Laufzeit wird außgewählt welche Funktion genommen wird!

    das ist überladung, und nein,die auswahl findet zur compiletime statt!

    das erste beispiel welches shade da gezeigt hat, ist echte polymorphie, und nur da gibts ne vtable 🙂



  • und was verstehst du dann unter späte Bindung??

    bye



  • das:

    class Shape
    {
    public:
      virtual void draw()=0;
    };
    
    class Circle  : public Shape
    {
    public:
      void draw();
    };
    
    class Square : public Shape
    {
    public:
      void draw();
    };
    
    void draw(Shape& shape)
    {
      shape.draw();
    }
    

    zur compilezeit ist nicht bekannt, welche draw-methode aufgerufen wird, wenn die funktion draw aufgerufen wird, da es komplett davon abhängig ist, welcher typ sich nun hinter dem übergebenen Shape verbirgt-ist es ein Kreis oder Quadrat?

    kleines codebeispiel:

    int main(){
        int i;
        Shape* shape;
        cin>>i;
        if(i==1){
            shape=new Circle();
        }
        else
        {
             shape=new Square();
        }
        draw(*shape);//weis der compiler welches objekt sich hinter shape verbirgt?
        delete shape;
    }
    

    bei einem

    template<class A>
    void draw(A& shape)
    {
      shape.draw();
    }
    

    hingegen, ist es zur compilezeit klar. Ich würde wzar jetzt gerne einen codeschnipsel anbieten, der zum obigen äquivalent ist, aber das ist nur sehr schwer bis garnicht möglich, eben weil zur compilezeit alles über den typ bekannt sein muss.


Anmelden zum Antworten