Visualizzazione dei risultati da 1 a 6 su 6

Discussione: c++ ed ereditarietà

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2001
    Messaggi
    147

    c++ ed ereditarietà

    ciao,
    ho una gerarchia del tipo
    class A{
    public:
    bla bla...
    }

    class C{
    public:
    virtual ~C(){},
    virtual void foo()=0;
    }

    class B: public class A, public class C{
    public:
    virtual void foo(){
    //bla blaa...
    }
    }

    in un metodo della mia applicazione ricevo un puntatore A* che però punta ad una istanza di B, che io però vorrei chiamare castandolo a C (Esistono varie classi che implementano C)
    quindi ho:
    .....
    A* a;
    ......assegnamento di a......
    C* c = (C*)a;
    c->foo(); //dà luogo a chiamate inconsistenti...

    cosa sbaglio? In java (mondo da cui provengo se C fosse un'interfaccia, sarebbe tutto perfettamente lecito..)
    grazie!

  2. #2
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Da una rapida lettura il tuo codice non funziona perchè le classi A e C non hanno nessuna relazione tra loro. Dovresti derivare C da A, e derivare B da A e C in modo virtual.

    Ripeto, da una rapida lettura, può darsi anche che abbia capito tutt'altra cosa.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2001
    Messaggi
    147

    già

    penso proprio che tu abbia ragione: in effetti A e C non appartengono alla stessa gerarchia. Sono rimasto però colpito da questo, perchè in java è perfettamente lecito e funziona (ok C è un'interface però..). Il problema è che è questa la semantica che il codice dovrebbe avere, quindi mi chiedevo, dato

    A
    | C
    | |
    |--------
    B

    se ci sia modo di ottenere un valido puntatore a C, dato A (Che in realtà punta a una istanza di B....)
    Come mi ha giustamente suggerito funziona, il problema è che in realtà C è un handler che B implementa e che non ha a che fare con la gerarchia A-B, inoltre non posso toccare il codice di A (legacy).
    grazie.

  4. #4
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Se non vuoi fare una gerarchia, ti consiglio di usare l'overloading degli operatori.
    Farai un overloading dell'operatore di cast e all'interno della tua funzione troverai il modo di trasformare la classe A in una classe C

    esempio

    codice:
    class A
    {
          friend void operator C*() {Trasforma la tua classe qui}
      //metodi e dati
    
    }
    In questo modo, il compilatore saprà cosa fare quando incontrerà



    codice:
    C *p = (C*)A;
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Se A possiede almeno una funzione virtual è meglio un dynamic_cast.
    codice:
    class IBase { // interfaccia esposta da C
    	public:
    		virtual ~IBase()=0;
    		virtual void func1()=0;
    		virtual void outval()=0;
    };
    IBase::~IBase(){;}
    
    class Legacy { // A
    	public:
    		virtual ~Legacy() {;}
    		void func2() { cout << "Legacy" << endl ; val = 3; }
    		int val;
    		void printVal() { cout << val << endl; }
    };
    
    class Final : public Legacy, public IBase { // B
    	public:
    		~Final(){}
    		void func1() { func2(); }
    		void outval() { printVal(); }
    };
    
    int main(int argc, char* argv[]) {
    	Final f;
    	Legacy* a = &f;
    	IBase* ib = dynamic_cast<Final*>(a);
    
    	if (ib) {
    		ib->func1();
    		ib->outval();
    	}
    }

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2001
    Messaggi
    147
    ok ragazzi,
    grazie a tutti per i suggerimenti
    Paolo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.