Oppure

Loading
06/01/12 17:18
McFly
Salve ragazzi, ho un piccolo problemino nell'applicazione del concetto di polimorfismo.

Faccio un breve esempio generico per farvi capire qual'è il problema, senza soffermarmi sui dettagli e le implementazioni dei metodi delle rispettive classi.

class A
{
    public:
       void metodo1();
       void metodo2();
};


void A::metodo1()
{ 
   // fa qualcosa
}

void A::metodo2();
{
    // fa qualcosa
    metodo1();  // usa il metodo 1
    // fa qualcos'altro ancora
}


Fin qui nessun problema.... ora creo una classe B che eredita da A


class B : public A
{
   // definizione classe B
};


Qui arrivano i problemi, in quanto in questa classe mi servirebbe il metodo2() della classe A(che applicando l'ereditarietà ho a disposizione tranquillamente)
che ha al suo interno il metodo1() che oltre che fare (quel qualcosa che fa nella classe A, ho bisogno di aggiungere altre istruzioni).

quindi

void metodo1()
{  // fa quello che fa nella classe A
   // aggiunta istruzioni da fare solo nella classe B
}



Ora mi chiedo innanzitutto se per realizzare ciò, è corretto utilizzare il polimorfismo, ed in caso affermativo, è sufficiente dichiarare metodo1 nella classe A con la keyword virtual e poi ridefinire lo stesso metodo1 nella classe B derivata con le aggiunte che mi servono? A questo punto poi, potrei utilizzare tranquillamente metodo2 mediante classe B ereditato da classe A ed il compilatore automaticamente andrà a stabilire quale metodo1 utilizzare al suo interno in base alla classe che lo chiama? (scusate il gioco di parole :noway: )



Ultima modifica effettuata da McFly 06/01/12 17:22
aaa
06/01/12 20:35
pierotofy
Si, basta definire metodo1 virtual nella classe A.
Il mio blog: piero.dev
06/01/12 21:18
Pitagora
Io farei così:

#include <iostream>

class A
{
public:
    void metodo1()
    {
        std::cout << "Metodo 1 --> A" << std::endl;
    }

    void metodo2()
    {
        metodo1();
    }
};

class B : public A
{
public:
    void metodo1()
    {
        A::metodo1(); // chiama la funzione membro della classe padre
        std::cout << "Un altro metodo 1 --> B" << std::endl; // altra istruzione
    }

    void metodo2()
    {
        metodo1();
    }
};


int main()
{
    B ().metodo2();

    return 0;
}
Ultima modifica effettuata da Pitagora 06/01/12 21:33
aaa