Hai solo bisogno di una funzione membro virtuale nella tua superclasse:
class Superclass
{
virtual void specialAbility() = 0;
};
E implementazioni nelle sottoclassi:
class Subclass1 : public Superclass
{
void specialAbility()
{
// Do something specific to this subclass...
}
};
class Subclass2 : public Superclass
{
void specialAbility()
{
// Do something specific to this subclass...
}
};
Ora, quando fai le tue battaglie, puoi fare qualcosa di simile ( modificato per mettere in classe ):
class BattleDoer
{
void doBattle(std::vector<Superclass*> combatants)
{
for (unsigned int index = 0; index < combatants.size(); index++)
{
combatants.at(index)->specialAbility();
}
}
};
Questo farà sì che la funzione membro appropriata definita nella sottoclasse venga chiamata su ciascuno degli oggetti combattenti.
Modifica
Per popolare il tuo elenco di combattenti e chiamare la funzione doBattle()
, puoi fare qualcosa di simile a questo:
int main()
{
Superclass* combatant1 = new Subclass1;
Superclass* combatant2 = new Subclass2;
std::vector<Superclass*> combatants;
combatants.push_back(combatant1);
combatants.push_back(combatant2);
BattleDoer battleDoer;
battleDoer.doBattle(combatants);
delete combatant1;
delete combatant2;
}
È importante utilizzare i puntatori qui. Solo i puntatori e i riferimenti possono essere utilizzati per fornire il polimorfismo. Non puoi avere variabili di tipo Superclass
perché non può essere istanziato, puoi solo avere riferimenti e puntatori di tipo Superclass
. Probabilmente si dovrebbero usare puntatori intelligenti, ma ho pensato di mantenerlo semplice.