Casting Abgeleitete Klasse zu Basisklasse
Ich habe ein kniffliges kleines problem ich habe über den Weg laufen. Ich glaube das problem hat zu tun mit der Art, wie ich bin casting-Sachen.
Also ich habe eine Basis-Klasse aufgerufen combatEntity
. Es hat die folgende Funktion
class combatEntity {
public:
virtual void update();
};
Habe ich dann einen Klasse mob, die abgeleitet ist von combatEntity
, überschreibt die update-Funktion:
class mob : public combatEntity {
public:
virtual void update();
}
Dann habe ich eine Klasse namens monster
, die abgeleitet ist von mob
und überschreibt auch die update-Funktion.
class monster: public mob {
public:
virtual void update();
}
Ich habe eine combatEntity Zeiger genannt i
:
combatEntity* i;
Dann habe ich:
//returns a mob* pointer (needs explicit cast)
monster* newMonster = getMob();
i = newMonster;
Den getMob()
Funktion:
mob* getMob() {
mob* newMob = new mob();
//set some data in newMob
return newMob;
}
Wenn ich rufe i->update()
ruft es mob::update()
, weil newMonster
auf "neuen mob();", da getMob()
gibt einen neuen mob Zeiger. Wenn ich Anrufe i->update()
brauche ich es nennen monster::update()
, aber mit Haltepunkte, ich sehe es ruft mob::update()
und nicht monster::update()
.
so, ich brauche zum erstellen einer neuen monster
- Objekt, aber noch ist es Basisklasse Daten gefüllt, die mit dem Objekt zurückgegeben, von getMob()
haben, aber die Funktionen überschrieben, richtig. Ich habe auch versucht, dynamic_cast, static_cast und reinterpret_cast, und keiner scheint zu arbeiten. Oder muss ich den cast von meiner Basisklasse in eine abgeleitete Klasse, während korrekt überschreiben von Funktionen der abgeleiteten Klasse.
Ich hoffe, dies macht Sinn. Jede Beratung wäre geschätzt.
- monster ist ein mob, nicht die andere Weise herum. Ich sehe nicht, wie die Besetzung
monster* newMonster = getMob();
ist implizit... - sorry, ich meinte es Bedarf einer expliziten cast. Fixe Frage.
- Könnten Sie fügen Sie ein wenig mehr code? Zu wissen, wie
getMob()
arbeitet, würde hilfreich sein. - Sie haben die Beziehung
combatEntity <-- mob <-- monster
. Wie machst du dasmonster* newMonster = getMob();
? - Ich bin verwirrt. Ihre Einrichtung nicht sinnvoll erscheinen. wenn Sie sagen
new mob
Sie nicht über einemonster
! Sie sollten sehr ernsthaft befolgen Sie die Ratschläge, um nicht-Blatt-abstrakte Klassen, und alle Ihre Probleme verschwinden. - Wenn Ihr
getMob()
hat einereturn new mob;
Sie sollten Sie nicht static_cast es zu einemmonster
. Die letztere möglicherweise nicht initialisierte Variablen und einen völlig anderen v-Tabelle. Sie können sicher mit einemdynamic_cast
. Dies scheitert in Ihrem Fall, die gut, weil Sie nicht über einemonster
. - getMob() im Grunde nur die Renditen neuen mob();
- Die Linie
i = monster;
macht keinen Sinn!monster
ist ein Typ. Meinst dumonster * i = getMob();
? Bitte editieren, wenn das der Fall ist. - Ich denke, er macht einen
i = newMonster;
- sorry, meinte ich = newMonster; fest-Frage
- Ich hasse diese sinnlos lokalen Variablen mit einer Rache...
Du musst angemeldet sein, um einen Kommentar abzugeben.
werfen Sie einen Blick auf Ihre Hierarchie, stellen Sie sicher, dass die Klassen beziehen, wie Sie denken.
Dieser code
erzeugt diese Ausgabe:
Quelle: http://ideone.com/k6LAB
combatEntity
Zeiger und die eine erstellt durchnew monster
sind die gleichen und die Zuordnung dernew monster
Zeiger aufcombatEntity
Zeiger nicht verpasst demnew monster
selbst oder copyies nichts. Das einzige was passiert, ist, dass Sie einmonster
alscombatEntity
, aber, wenn die Hierarchie-Baum der richtige ist, ruft die Funktion endet in dermonster
Klasse.Ihre Linie
sollte nicht kompilieren. Ich bekomme
(auch Ihre Linie
i = monster;
sollte vermutlich Leseni = newMonster;
). Das erklärt alles, denke ich (siehe auch Kommentar von Luchian).Gut, da Sie mit virtuellen, "update" wird, rufen Sie immer die richtige Funktion, egal, was Sie erklären, dass der Zeiger. Das ist nur, wie "virtuelle" funktioniert.
Wenn Sie möchten, dass Ihre Zeiger zu bestimmen, was aufgerufen wird, anstatt das Objekt selbst, dass das Zeug nicht virtuell. In diesem Fall wird der Zeiger-Typ bestimmt, welche "update" wird immer genannt.
Wenn Sie möchten, können Sie immer noch rufen so etwas wie monster::update() anstatt update. Jedoch, es sei denn, Sie tun dies innerhalb einer abgeleiteten Klasse update-Funktion (Aufruf des superclass-Umsetzung), der versucht in der Vergangenheit in der Vererbungshierarchie kann das ein Zeichen für schlechtes design.
monster* m = static_cast<monster*>(new mob()); m->update();
nennt das 'falsche' Methodemob::update()
.