Methoden überschreiben...
-
Realisiere das ganze mit Zeigern auf k1 Objekte, dann wirst du das erwartete Ergebnis erhalten. Da dabei keine Konvertierung notwendig ist.
Gruß Mirauder Mo
-
Alles klar, geht...
danke für die schnelle Antwort..mfg Notrix
-
Helft mir mal kurz auf die Sprünge:
Wäre es nicht richtiger, einen vector<k2*> zu nehmen? Denn im anderen Falle würde das Eintragen eines Pointers auf ein Objekt vom Typ k2 dazu führen, daß der vector einen Pointer vom Typ k1 ablegt. d.h. würde dann nicht logischerweise auch die Methode der Basisklasse aufgerufen?
Für mich sieht das nach nem Downcast aus, und den sollte man imho vermeiden.
-
Docster schrieb:
Helft mir mal kurz auf die Sprünge:
Wäre es nicht richtiger, einen vector<k2*> zu nehmen? Denn im anderen Falle würde das Eintragen eines Pointers auf ein Objekt vom Typ k2 dazu führen, daß der vector einen Pointer vom Typ k1 ablegt. d.h. würde dann nicht logischerweise auch die Methode der Basisklasse aufgerufen?
Für mich sieht das nach nem Downcast aus, und den sollte man imho vermeiden.
NEIN!
In einen vector<k2*> könntest du doch garkeinen Pointer auf ein k1 ablegen, also in so einem Fall immer Pointer auf die Basisklasse.
Die Methode ist virtual, also wird dann auch die richtige Methode aufgerufen. Also wenn in wirklichkeit ein k2 Objekt dahinter steht die k2 Methode sonst die k1 Methode.
Und gecastet wird bei der ganzen Sache überhaupt nicht.Gruß
Entyl Sa
-
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.