Subtyping



  • Kenne Subtyping-Polymorphie aus Java.....Jetzt die Frage : In welchem Kontext spricht man in C++ von Subtyping ?
    Subtyping kann doch eigentlich nur auf Zeigern/Referenzen(also Adresstypen) richtig funktionieren , oder ? Auf den Objekten selber würde eine Zuweisung der Form
    Ober = Unter(bereits exitierender Objekte) ja z.B irgend einen Objektteil des Subobjekts unterschlagen...jetzt hat man doch die Möglichkeit Zuweisungsoperatoren so selbst zu definieren , dass Zuweisungen dieser Art auch für die Objekte selbst (nicht auf deren Zeigern) wie gewünscht funktionieren ....hab ich aus Breymann 9.Auflage Kapitel "Zuweisungsoperator und Vererbung"......Hatt das jetzt überhaupt irgendwas mit Subtyping zu tun , oder spricht man in diesem Kontext nicht von Subtyping , bzw. für was und wann braucht man sowas und wann kann eine Zuweisung von Ober = Unter für die Objekte selbst jemals sinnvoll funktionieren(wegen den normalerweise fehlenden Attributen der abstarkteren Klasse usw...)? Hier noch ein Link zu einer Leseprobe des Buchs : http://www.edv-buchversand.de/productinfo.php?cnt=productinfo&id=ha-41023&type=2&lng=0
    Die Pdf unter Leseprobe runterladen und nach "Zuweisungsoperator und Vererbung" suchen......wen es interessiert ... (Das Kapitel ist nur etwa 4 Seiten lang)....In einem anderen Thread wurde außerdem bereits ein Fehler im Kapitel gefunden und jetzt weiß ich gar nicht mehr was ich überhaupt damit anfangen soll......Jedenfalls schon mal danke für die Hilfe im Vorraus.....



  • Toman schrieb:

    Kenne Subtyping-Polymorphie aus Java.....Jetzt die Frage : In welchem Kontext spricht man in C++ von Subtyping ?

    In C++ kannte ich Subtypes bisher nur als Bezeichnung für Memberklassen (also innere Klassen). Vererbung heißt einfach Vererbung/Inheritance.

    Subtyping kann doch eigentlich nur auf Zeigern/Referenzen(also Adresstypen) richtig funktionieren , oder ?

    Richtig. Ist in Java ja auch so - Java-Variablen sind schließlich grundsätzlich Referenzen.

    Auf den Objekten selber würde eine Zuweisung der Form
    Ober = Unter(bereits exitierender Objekte) ja z.B irgend einen Objektteil des Subobjekts unterschlagen...

    Jup, das nennt sich Slicing. Der Kindklassen-Teil des Objektes wird nicht mit kopiert.

    jetzt hat man doch die Möglichkeit Zuweisungsoperatoren so selbst zu definieren , dass Zuweisungen dieser Art auch für die Objekte selbst (nicht auf deren Zeigern) wie gewünscht funktionieren

    Nein, nicht wirklich. Du kannst einem Base kein Derived zuweisen, so dass es zu einem Derived wird. Der Typ bleibt, und es wird immer nur der Base-Teil kopiert. Für den Derived-Teil existieren ja einfach keine Variablen.

    wann kann eine Zuweisung von Ober = Unter für die Objekte selbst jemals sinnvoll funktionieren(wegen den normalerweise fehlenden Attributen der abstarkteren Klasse usw...)?

    Es gibt einzelne Anwendungsbereiche wo man tatsächlich nur den Base-Teil kopieren will, d.h. wo man das Slicing möchte.. Statt explizit nur den Base-Teil des Derived-Objekts zu kopieren übergibt man das komplette Derived-Objekt. Beispiele sind Copy-Konstruktoren und op= der abgeleiteten Klasse:

    class Base;
    
    class Derived : public Base
    {
      static int counter = 0;
      int ID;
    public:
      Derived(Derived const& rhs)  //Copy-Ctor
      : Base(rhs) //nur Base-Teil von rhs kopieren!
      , ID(++counter)
      {}
    
      Derived& operator=(Derived const& rhs)
      {
        Base::operator=(rhs); //nur Base-Teil von rhs kopieren!
      }
    };
    


  • Auf den Objekten selber würde eine Zuweisung der Form
    Ober = Unter(bereits exitierender Objekte) ja z.B irgend einen Objektteil des Subobjekts unterschlagen...

    Jup, das nennt sich Splicing. Der Kindklassen-Teil des Objektes wird nicht mit kopiert.

    Ehm.. war das nicht Slicing?
    Simon



  • theta schrieb:

    Auf den Objekten selber würde eine Zuweisung der Form
    Ober = Unter(bereits exitierender Objekte) ja z.B irgend einen Objektteil des Subobjekts unterschlagen...

    Jup, das nennt sich Splicing. Der Kindklassen-Teil des Objektes wird nicht mit kopiert.

    Ehm.. war das nicht Slicing?
    Simon

    Jup sorry. Ist noch früh...


Anmelden zum Antworten