Methoden überschreiben...



  • Und gecastet wird bei der ganzen Sache überhaupt nicht.

    Und was ist mit dem impliciten Upcast wenn du den Pointer in den Vector einfügst?



  • Gar nichts ist damit, weil diese Casts gar nicht existieren. Es ist ledidglich eine Frage, wie der Speicher an der angegebenen Stelle interpretiert wird.
    Das würde einem reinterpret_cast entsprechen, der bekanntlich gar nichts macht.



  • Nicht ganz. Je nach Compiler und Situation (Mehrfachvererbung etc.) muss der Zeiger angepasst werden, damit er auf die richtigen Datenelemente zeigt.



  • Sicher? Ein Zeiger auf ein abgeleitetes Objekt müsste doch auf das selbe erste Element zeigen, wie der Zeiger auf ein Basisklassen-Objekt IMO.
    Ok, aber es stimmt schon, man weiss nie so ganz genau, was die Compiler da alles h4Xx0ren. 😉
    Aber generell bin ich der Ansicht, dass man Pointer-Casts keine große Beachtung schenken sollte, auch nicht solchen, die kurz die RTTI abchecken müssen (dynamic_cast) und schon gar nicht den impliziten Casts.

    P.S.: Ok, bei Mehrfachvererbung könnte die Situation anders aussehen, vor allem bei den expliziten Casts.
    Aber Mehrfachvererbung ist ja sowieso böse. 😉 😃



  • *** schrieb:

    Und was ist mit dem impliciten Upcast wenn du den Pointer in den Vector einfügst?

    Für mich gibt es da keinen cast. Ein k2 Objekt ist immer auch ein k1 Objekt. Also ist auch ein Zeiger auf ein k2 Objekt ein Zeiger auf ein k1 Objekt, also wird kein cast benötigt.

    Das problem bei der Mehrfachvererbung ist mir bisher zwar nicht bewust gewesen, aber ja ziehmlich einleuchtend. Aber Mehrfachvererbung ist ja eh Teufelswerk.

    Gruß
    Entyl Sa



  • Natürlich ist das ein upcast. Aber er ist implizit - dh er geschieht automatisch. Vorhanden ist er trotzdem.



  • Sicher ist kann ich einen k1-pointer auf ein k2-Objekt nehmen, aber was ist denn mit der Pointer-Arithemitk? Ein k2-Objekt kann grösser sein als ein k1-Objekt, aber kein k1-Objekt kann grösser als ein k1-Objekt sein. Ergo würde wegen des Offsets das folgende nicht zwangsläufig funktionieren, oder?

    vector<k1*> myVec;
    k1* p2 = new k2();
    k1* p1 = new k1();
    myVec.push_back(p2);
    myVec.push_back(p1);
    k1* test = myVec[0];
    test++;
    assert( test != p1);
    


  • hab blödsinn geschrieben



  • Docster schrieb:

    vector<k1*> myVec;
    k1* p2 = new k2();
    k1* p1 = new k1();
    myVec.push_back(p2);
    myVec.push_back(p1);
    k1* test = myVec[0];
    test++;
    assert( test != p1);
    

    Das wird nicht funktionieren, genausowenig wie das:

    vector<int> myVec;
    myVec.push_back(1);
    myVec.push_back(0);
    int test = myVec[0];
    test++;
    assert(test == 0);
    

    Du musst &myVec[0] schreiben, nur dann bekommst du einen Zeiger auf das erste Element, sodass ++ das gewünschte bewirkt.



  • Gut, wenn ich das mit & schreibe, ist nicht auszuschliessen, dass ich bei dem Versuch, mit dem Offset sizeof(k1) ein Objekt der Grösse sizeof(k2) zu "übersüpringen" ganz schön daneben lande.



  • Docster schrieb:

    Gut, wenn ich das mit & schreibe, ist nicht auszuschliessen, dass ich bei dem Versuch, mit dem Offset sizeof(k1) ein Objekt der Grösse sizeof(k2) zu "übersüpringen" ganz schön daneben lande.

    Wo hast du denn hier Objekte? Ich sehe nur ein Array aus Zeigern auf Objekte.

    Folglich:
    Index 0: &vec[0] + sizeof(k1*)0
    Index 1: &vec[0] + sizeof(k1
    )1
    Index 2: &vec[0] + sizeof(k1
    )2
    Index 3: &vec[0] + sizeof(k1
    )*3
    ...

    Da kommt sizeof(k1) bzw. sizeof(k2) nirgends ins Spiel...



  • sizeof(*k2) muss es natürtlich heissen, denn ein k2++ bedeutet doch nichts anderes als ein k2 = k2 + sizeof(*k2), während ein k1++ k1 = k1 + sizeof(*k1) entspricht.


Anmelden zum Antworten