Polimorfismo e passaggio

1

Sto scrivendo un RPG basato su testo, e ho tre classi che ereditano da una super classe, hanno tutti degli attacchi speciali che possono eseguire, allo stesso tempo ho una classe che detiene la funzione che gestisce le battaglie nel mio gioco.

Come faccio ad avere le straordinarie funzioni di abilità speciali per qualsiasi ruolo il giocatore scelga nella funzione di battaglia?

Inoltre sto usando il metodo vector.push_back per gestire il modo in cui le mie sottoclassi sono referenziate.

    
posta Tucker Morgan 31.03.2012 - 07:06
fonte

1 risposta

1

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.

    
risposta data 31.03.2012 - 09:42
fonte

Leggi altre domande sui tag