Ersetzen Templates Polymorphie?



  • Nein, machen sie nicht. Es gibt aber starke Parallelen, wie du bemerkt hast. Daher ja auch die erwarteten Sprachfeatures Concepts/Modules für den nächsten Standard. So lange wirst du dich wohl mit CRTP begnügen müssen, wenn du etwas mehr Typsicherheit willst. Bzw. schönere Compilierfehler, die bekommst du in jedem Fall wenn etwas nicht läuft.
    Also: Wo ersetzen Templates Polymorphie?
    Überall da, wo der Typ bereits zur Compilezeit bekannt ist. Das kann z.B. für Algorithmen gelten. (Siehe <algorithm> der Standardbibliothek.)

    Und jetzt kannst du dir auch denken, wo Templates Polymorphie nicht ersetzen. Genau dann, wenn der Typ zur Compilezeit nicht bekannt ist. Einen vector<unique_ptr<object*>> bekommst du mit Templates nicht hin. 😉

    Edit:
    Deinem Code nach zu urteilen weißt du aber nicht mal was Polymorphie eigentlich ist, lol.



  • unique_ptr kenn ich noch nicht.

    So steht das in einer Powerpoint Präsentation auser Schule:

    In C++ kann man mehreren Funktionen den
    gleichen Namen geben, wenn sie sich entweder...
    in der Anzahl der Übergabeparameter oder
    in den Datentypen der übergebenen Parameter
    unterscheiden

    Oops in der Präsentation steht das im Zusammenhang vom Konstruktor

    class table
    {
    public:
    
    	int nr;
    	string str;
    
             // Polymorphie 
    	table () {}
    	table ( int n , string s ) : nr(n) , str (s) { } 
    };
    

    Aber gilt das für Funktionen nicht auch?
    Ok meine Funktionen war eben nicht in einer Klasse ... Wie nennt man das was ich geschrieben habe?



  • Vorlage schrieb:

    Wie nennt man das was ich geschrieben habe?

    Overloading. Und die Beschreibung aus dieser Präsentation ist dafür korrekt. Nur dieser kleine Kommentar "Polymorphie" nicht.



  • In der Präsentation steht auch:

    Polymorphie
    (=Vielgestaltigkeit)
    bezeichent man auch als Überladen von Funktionen

    😕 versteh ich da was falsch oder hat der Lehrer selber keine Ahnung was er da macht? ...

    Ich glaub ich les gleich mal im C++ Primer nach irgendwie gefällt mir die Präsentation nicht.



  • Vorlage schrieb:

    Polymorphie
    (=Vielgestaltigkeit)
    bezeichent man auch als Überladen von Funktionen

    ähm... nein.

    Polymorphie ist:

    class Form
    {
      public:
        virtual Print()=0;
    };
    
    class Kreis : public Form
    {
      public:
        void Print() {...};
    };
    
    class Rechteck : public Form
    {
      public:
        void Print() {...};
    };
    
    std::vector<Form*> formen;
    formen.push_back(new Kreis());
    formen.push_back(new Rechteck());
    
    for_each(Form* form : formen)
      form->Print();
    

    Dabei wird dann "wie von Zauberhand" die richtige Print()-Methode aufgerufen.

    Disclaimer: nur ein schnell zusammengetipptes Beispiel. Natürlich sollte man new niemals so benutzen, sondern die Instanzen in einem Smartpointer halten.

    edit: gerade folgende "Definition" gefunden:

    Bei Poymorphie haben die Methoden die gleiche Signatur, sind jedoch in verschiedenen Klassen implementiert. Zur Laufzeit wird anhand des Objekttyps entschieden, welche Methode gerufen wird.

    Überladen besagt, dass die Methoden den gleichen Namen, aber veschiedene Parameter haben.



  • Danke für das Beispiel.

    Jetzt werde ich erst mal diese dämliche Präsentation löschen!
    Das ärger mich jetzt schon wieder das man was lernt was falsch ist. 😡



  • Vorlage schrieb:

    😕 versteh ich da was falsch oder hat der Lehrer selber keine Ahnung was er da macht? ...

    Bei solchen Fragen antworte ich immer gerne: Was hälst du für wahrscheinlicher? Traurigerweise macht die Frage auch hier Sinn. Ich bin nur froh aus dem Verein raus zu sein. So peinlich war mein Lehrer dann aber doch nicht.



  • In C++ versteht man unter Polymorphismus eigentlich nur Inklusionspolymorphismus, d.h. virtuelle Funktionen. Templates sind eigentlich parametrischer Polymorphismus, nur nennt das in C++ kaum jemand so. Überladen ist bei manchen Autoren auch eine Form von Polymorphismus.

    Aber die Präsentation stellt es ja so dar, als sei Überladen dasselbe wie Polymorphismus. Das ist natürlich kompletter Unsinn.



  • Vorlage schrieb:

    Kann es sein das Templates Polymorphie nutzlos machen?

    Wenn du mit Polymorphie, polymorphe Klassen mit ihren virtuellen Funktionen meinst: Nö. Die Dinger sind eigentlich orthogonal zueinander.

    @Bashar: "Polymorphismus" oder "Polymorphie"? 😉



  • krümelkacker schrieb:

    @Bashar: "Polymorphismus" oder "Polymorphie"? 😉

    Öhm. 🙂 Wenn das einen Unterschied macht, bitte erklären.



  • Bashar schrieb:

    Öhm. 🙂 Wenn das einen Unterschied macht, bitte erklären.

    Der Begriff "Polymorphismus" wird eigentlich nur in der Genetik benutzt -> Sequenzvariation.

    In der Programmierung benutzt man Polymorphie für vieles, z.B. auch die Überladung von Operatoren und Funktionen usw. Allerdings wird in C++ Polymorphie für Polymorphie im objektorientierten Sinne genommen, also nicht für Funktionsüberladungen. Ob man unter Polymorphie jetzt nur die Laufzeitpolymorphie (ableiten + virtuelle Funktionen & Co.) oder auch die Compilezeitpolymorphie (über Templates) versteht, ist unterschiedlich. Meistens wird Compilezeitpolymorphie aber explizit so genannt. "parametrische Polymorphie" wird sowas eher selten genannt (wenn überhaupt)



  • pumuckl schrieb:

    Der Begriff "Polymorphismus" wird eigentlich nur in der Genetik benutzt -> Sequenzvariation.

    Oder wenn man wie ich englische Begriffe 1:1 ins Deutsche überträgt. Der Angelsachse sagt zu Polymorphie polymorphism.

    Allerdings wird in C++ [...] "parametrische Polymorphie" wird sowas eher selten genannt (wenn überhaupt)

    Das hab ich doch gesagt.


Anmelden zum Antworten