Hallo,
also ich hab wieder mal ein prob mit der vererbung
ich möchte gerne eine dynamische größe haben für gegner, also statt nem array CEnemy[50] möcht ich es so haben.
|
C-/C++-Quelltext
|
1
|
*CEnemy = new CEnemy[Größe die ich eben gerade brauche];
|
das scheint kein problem zu sein und funktioniert auch. jetzt wäre es praktisch, wenn ich natürlich statt der basisklasse CEnemy, noch unterschiedliche gegnertypen zuweisen könnte.
z.b.
|
C-/C++-Quelltext
|
1
2
|
CEnemy[0] = CRat();
CEnemy[1] = CDrake();
|
usw. auch das funktioniert problemlos, nur funktioniert die methodenüberschreibung nicht
also wenn ich dann folgendes ausführe
|
C-/C++-Quelltext
|
1
|
CEnemy[i].Attack();
|
wird IMMER nur die attackfunktion der basisklasse aufgerufen.
ein weiteres problem ist, dass , wenn z.b. die subclass CRat eine funktion Bite(); besitzt, kann ich diese nicht aufrufen, da es ja keine funktion von CEnemy ist.
jetzt wollt ich fragen, wie man so ein problem am besten lösen könnte. mit nem array ists nicht schwer
, aber würd teilweise unnötigen speicherplatz verbrauchen und/oder zu wenig platz zur verfügung stellen.
hier mal mein ansatz
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
|
class CEnemy
{
public:
// Methods
CEnemy();
virtual ~CEnemy(){};
virtual void Attack();
|
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
|
class CRat : public CEnemy
{
public:
CRat();
void Attack();
void Bite();
};
|
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
void createEnemies(CEnemyGroup *Group)
{
// Create number of enemies
g_Fighters = new CEnemy[Group->iNumMonsters];
for(int i=0; i<Group->iNumMonsters; i++)
{
switch(Group->iMonsterIDs[i])
{
case(10):
{
// RAT
g_Fighters[i] = CRat();
} break;
}
g_Fighters[i].showStats();
}
|
bei show Stats zeigt es die werte einer ratte an, somit weiß ich schonmal,dass das funktioniert
aber bei attack, wird eben nur die virtual void attack() aufgerufen und bite kann ich sowieso ned aufrufen
bitte um hilfe
mfg
Simon