[C++] polimorfismo a run-time

di il
4 risposte

[C++] polimorfismo a run-time

Salve ragazzi,avrei bisogno di un chiarimento riguardante il polimorfismo a run-time...

ho creato queste linee di codice per utilizzare il polimorfismo a run-time:

#include<stdio.h>
#include <iostream>
#include<string>
#include <stdlib.h>

using namespace std;

class persona{
	protected:
		char att1[30];
	public:
		persona(){};
		~persona(){};
		virtual void compila(char * attributo1){
			strcpy(att1, "persona");
		}
		virtual void get(){
			cout << "\natt1:" <<att1 <<"\n";
		}
};


///////////////////////////////////////////////////////////////////////////////////////////////////////////////
class padre: virtual public persona{
	protected:
		char att2[30];
	public:
		padre(){};
		~padre(){};
		void compila(char * attributo1,char * attributo2){
			strcpy(att1, attributo1);
			strcpy(att2, attributo2);
		}
		void get(){
			cout << "\natt1:" <<att1 <<"\n";
			cout << "\natt2:" <<att2 <<"\n";
	}
};


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class madre: virtual public persona{
	protected:
		char att3[30];
	public:
		madre(){};
		~madre(){};
		void compila(char * attributo1,char * attributo3){
			strcpy(att1, attributo1);
			strcpy(att3, attributo3);
		}
		void get(){
			cout << "\natt1:" <<att1 <<"\n";
			cout << "\natt3:" <<att3 <<"\n";
		}
};


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class figlio:public padre,public madre{
	public:
		figlio(){};
		~figlio(){};
		void compila(char * attributo1,char * attributo2,char * attributo3){
			strcpy(att1, attributo1);
			strcpy(att2, attributo2);
			strcpy(att3, attributo3);
		}
		void get(){
			cout << "\natt1:" <<att1 <<"\n";
			cout << "\natt2:" <<att2 <<"\n";
			cout << "\natt3:" <<att3 <<"\n";
		}
		
};


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main(){
	int a;
	char attributo1[30];
	char attributo2[30];
	char attributo3[30];
	persona *p;
	cout << "Immetti dati:\n";
	cin >> attributo1;
	cin >> attributo2;
	cin >> attributo3;
	p = new padre;
	p->compila(attributo1,attributo2);                       /*<------errore!*/
	p->get();
	cin >> a;
	return 0;
}
purtroppo però il compilatore mi segnala il seguente errore nel rigo che ho evidenziato:

- error C2660: 'compila' : function does not take 2 parameters

Tale errore fa suporre che il compilatore consideri la funzione compila della classe persona anche se il puntatore p punta ad un oggetto di tipo padre istanziato dinamicamente nella memoria heap.

Come è possibile?
Dove sbaglio?

4 Risposte

  • Re: [C++] polimorfismo a run-time

    
    p = new padre;
    padre *ptr = dynamic_cast<padre *>(p);
    ptr->compila(attributo1,attributo2);
    
    Leggi quì
    http://en.wikipedia.org/wiki/Virtual_inheritanc

    quì invece è proprio spiegato il tuo caso e anche il perche non puoi fare le chiamate alle funzione di classi derivate senza il cast:
  • Re: [C++] polimorfismo a run-time

    Ho capito,grazie mille...mi hai aiutato anche sta volta...
    comunque devo utilizzare per forza le funzioni virtual e non posso usare ridefinition cast...
    perciò ho fatto così
    
    #include<stdio.h>
    #include <iostream>
    #include<string>
    #include <stdlib.h>
    
    using namespace std;
    
    class persona{
    	protected:
    		char att1[30];
    	public:
    		persona(){};
    		~persona(){};
    		virtual void compila(){
    			char attributo1[30];
    			cin >> attributo1;
    			strcpy(att1,attributo1);
    		}
    		virtual void get(){
    			cout << "\natt1:" <<att1 <<"\n";
    		}
    };
    
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    class padre: public persona{
    	protected:
    		char att2[30];
    	public:
    		padre(){};
    		~padre(){};
    		void compila(){
    			char attributo1[30];
    			char attributo2[30];
    			cin >> attributo1;
    			cin >> attributo2;
    			strcpy(att1, attributo1);
    			strcpy(att2, attributo2);
    		}
    		void get(){
    			cout << "\natt1:" <<att1 <<"\n";
    			cout << "\natt2:" <<att2 <<"\n";
    	}
    };
    
    
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    class madre: public persona{
    	protected:
    		char att3[30];
    	public:
    		madre(){};
    		~madre(){};
    		void compila(){
    			char attributo1[30];
    			char attributo3[30];
    			cin >> attributo1;
    			cin >> attributo3;
    			strcpy(att1, attributo1);
    			strcpy(att3, attributo3);
    		}
    		void get(){
    			cout << "\natt1:" <<att1 <<"\n";
    			cout << "\natt3:" <<att3 <<"\n";
    		}
    };
    
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    class figlio:public padre,public madre{
    	public:
    		figlio(){};
    		~figlio(){};
    		void compila(){
    			char attributo1[30];
    			char attributo2[30];
    			char attributo3[30];
    			cin >> attributo1;
    			cin >> attributo2;
    			cin >> attributo3;
    			strcpy(padre::att1, attributo1);
    			strcpy(att2, attributo2);
    			strcpy(att3, attributo3);
    		}
    		void get(){
    			cout << "\natt1:" <<padre::att1 <<"\n";
    			cout << "\natt2:" <<att2 <<"\n";
    			cout << "\natt3:" <<att3 <<"\n";
    		}
    		
    };
    
    
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    int main(){
    	int a;
    	persona *p;
    	p = new padre;	
    	cout << "Immetti dati:\n";
    	p->compila();
    	p->get();
    	cin >> a;
    	return 0;
    }
    
    Ora funziona ma ho una domanda:
    le funzioni compila delle classi derivate da persona hanno tutte lo stesso prototipo (e ciò mi consente il polimorfismo a run-time) ma al loro interno trattano anche attributi che non appartengono alla classe base persona...ad esempio la funzione compila della classe padre tratta al suo interno att2 che è un attributo di padre e non di persona...ciò può causare problemi oppure è tutto regolare?

    cioè, all'interno della funzione compila di una sottoclasse, posso trattare attributi che appartengono solo alla sottoclasse e non alla classe base?(insomma come ho fatto adesso)
  • Re: [C++] polimorfismo a run-time

    E' lecito si. Infatti se tu crei una classe derivata che non estende quella base allora che polimorfismo è. Tanto vale chiamare la classe base. Quindi va bene così come stai faccendo.
  • Re: [C++] polimorfismo a run-time

    Grazie mille skynet...sei una persona veramente gentile e disponibile...grazie per le risposte...
Devi accedere o registrarti per scrivere nel forum
4 risposte