Ich wollte alle statischen Elemente (Häuser, etc. ) die sich auf einer Karte meines Spiels befinden in einer verketten Liste speichern.
Für die einzelnen Elemente habe ich mir verschiedenen Klassen geschrieben, wie z.B. CHouse, die neben den Positionsangaben, etc auch einen Pointer auf ein 3D Modell besitzen. Um die Liste möglichst einfach zu halten, habe ich alle diese Klassen von einer Klasse CMapElment abgeleitet und speichere in der Liste Pointer vom Typ CMapElement der auf Objecte vom Typ CHouse, CTrunk, etc. zeigt.
Soweit funktioniert das auch alles.
Allerdings soll jetzt jedes Object eine eigene Render() Methode besitzen, da sich z.B. ein CHouse Object auch noch darum kümmern soll, daß alle Türen des Gebäudes gerendert werden. Da der Pointer aber eben den Typ der Vaterklasse hat, wird auch die Render() Methode der Vaterklasse aufgerufen. Aufrufen sollte er ja aber eigentlich die Methode der Kind-Klasse.
Um das alles zu verdeutlichen hier ein Codeschnipsel
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
|
class CMapElement();
class CHouse() : public CMapElement();
class CTrunk() : public CMap Element();
CHouse* haus1 = new CHouse();
CTrunk* trunk1 = new CTrunk();
...
addElementToList(haus1); // addElementToList speichert den
addElementToLost(trunk1); // übergeben Pointer als CMapElement*
...
getElementFromList()->render(); // hier wird dann die Methode CMapElement::render() ausgeführt, und nicht CHouse->render() oder CTrunk::render()
|
Wieso er die Methode der Vaterklasse nimmt ist mir schon klar, aber wie schaffe ich es, daß er die Methode der Kind-Klasse nimmt? Einfach den pointer umcasten wäre vielleicht eine Möglichkeit, aber dann brauch ich 100 Zeilen switch-case Code...