| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  01-11-2008, 17:10 | #1 | 
| Member Iscritto dal: Mar 2006 
					Messaggi: 47
				 | 
				
				[C++] EREDITARIETA' MULTIPLA
			 
		Vi faccio un esempio per poi farvi una domanda... ESEMPIO(molto stupido!!ma significativo!!): class nonno { public: int n; }; class madre: public nonno { public: int m; }; class padre: public nonno { public: int p; }; class figlio: public madre, public madre { public: int f; }; void main() { figlio f; f.n;/* quale n prenderà? quella di madre (ereditata da nonno) o quella di padre (ereditata da nonno)?*/ } C'è indubbiamente un errore!!! Per correggere questa cosa ci sono 2 possibilità: 1- utilizzo dell'operatore di risoluzione del campo d'azione(:  ; 2- madre e padre vendono ereditate in modo virtual(class madre: virtual public nonno....ecc); Fatto questo mi sono chiesto: quale sarà la dimesione in memoria nel momento in cui vado a creare un'istanza delle classi? Quindi nel main ho fatto: void main() { nonno n; cout<<sizeof(n); madre m; cout<<sizeof(m); padre p; cout<<sizeof(p); figlio f; cout<<sizeof(f); } risolvendo il problema ereditando madre e padre come classi virtuali l'output è stato: 4,12,12,24 (io mi aspettavo 4,8,8,12) Se le variabili delle classi fossero state dei char avrei avuto: 1,9,9,21 La mia domanda è: perchè????   Grazie in anticipo dell'aiuto Ultima modifica di alex05 : 01-11-2008 alle 17:18. | 
|   |   | 
|  01-11-2008, 18:51 | #2 | |
| Senior Member Iscritto dal: Sep 2004 Città: Interamnia Urbs 
					Messaggi: 2125
				 | 
		Domanda cretina, ma  Quote: 
 
				__________________ Un wormhole (buco di tarlo, in italiano), detto anche Ponte di Einstein-Rosen, è una ipotetica caratteristica topologica dello spaziotempo che è essenzialmente una "scorciatoia" da un punto dell'universo a un altro, che permetterebbe di viaggiare tra di essi più velocemente di quanto impiegherebbe la luce a percorrere la distanza attraverso lo spazio normale. Go to a Wormhole Ultima modifica di dierre : 01-11-2008 alle 18:59. | |
|   |   | 
|  02-11-2008, 09:53 | #3 | |
| Member Iscritto dal: Mar 2006 
					Messaggi: 47
				 | Quote: 
 Fai la prova ad eliminare il nonno e a far ereditare la stessa variabile da padre e madre al figlio... cmq è molto difficile che il figlio erediti una stessa variabile da madre e padre, invece è molto più probabile che ci sia un "nonno" in comune... pensaci... Per la situazione in memoria non sai dirmi nulla? | |
|   |   | 
|  02-11-2008, 10:23 | #4 | 
| Senior Member Iscritto dal: Sep 2004 Città: Interamnia Urbs 
					Messaggi: 2125
				 | 
		ho 4, 8, 8, 20 senza usare virtual edit: scusa, non avevo messo virtual, anch'io ho 4,12,12,24 
				__________________ Un wormhole (buco di tarlo, in italiano), detto anche Ponte di Einstein-Rosen, è una ipotetica caratteristica topologica dello spaziotempo che è essenzialmente una "scorciatoia" da un punto dell'universo a un altro, che permetterebbe di viaggiare tra di essi più velocemente di quanto impiegherebbe la luce a percorrere la distanza attraverso lo spazio normale. Go to a Wormhole Ultima modifica di dierre : 02-11-2008 alle 10:44. | 
|   |   | 
|  02-11-2008, 11:15 | #5 | 
| Member Iscritto dal: Mar 2006 
					Messaggi: 47
				 | 
		Se non ci fosse il "nonno" avremmo una situazione di questo genere: (per risolvere l'errore < n is ambiguos > in questo caso bisogna utilizzare l'operatore di risoluzione del campo d'azione) class madre { public: int m; }; class padre { public: int m; }; class figlio: public madre,public padre { public: int f; }; void main() { figlio f; f.padre::m=10;//USO DELL'OPERATORE DI RISOLUZIONE DEL CAMPO D'AZIONE cout<<f.padre::m<<"\n\n";//USO DELL'OPERATORE DI RISOLUZIONE DEL CAMPO D'AZIONE } Come mai mettendo virtual abbiamo quelle dimensioni? Non riesco a spiegarmelo... Ultima modifica di alex05 : 02-11-2008 alle 11:39. | 
|   |   | 
|  02-11-2008, 11:24 | #6 | 
| Senior Member Iscritto dal: Sep 2004 Città: Interamnia Urbs 
					Messaggi: 2125
				 | 
		Beh virtual ti permette il polimorfismo quindi viene aggiunta una tabella di memoria che permette di gestire il dynamic binding.
		 
				__________________ Un wormhole (buco di tarlo, in italiano), detto anche Ponte di Einstein-Rosen, è una ipotetica caratteristica topologica dello spaziotempo che è essenzialmente una "scorciatoia" da un punto dell'universo a un altro, che permetterebbe di viaggiare tra di essi più velocemente di quanto impiegherebbe la luce a percorrere la distanza attraverso lo spazio normale. Go to a Wormhole | 
|   |   | 
|  02-11-2008, 18:26 | #7 | |
| Member Iscritto dal: Mar 2006 
					Messaggi: 47
				 | Quote: 
 Attraverso il meccanismo virtual abbiamo il polimorfismo a run-time... dimmi qualcosa in più sulla tabella di memoria... Ti ringrazio | |
|   |   | 
|  02-11-2008, 19:43 | #8 | 
| Senior Member Iscritto dal: Sep 2004 Città: Interamnia Urbs 
					Messaggi: 2125
				 | 
		il C++ prepara, in fase di compilazione, delle tabelle, dette "Tabelle virtuali" o vtables, una per la classe  base e una per ciascuna classe  derivata, in cui sistema gli indirizzi di tutte le funzioni dichiarate virtuali nella classe  base; aggiunge inoltre un nuovo membro in ogni classe, detto vptr, che punta alla corrispondente vtable. spiegazione lunga: http://jolly.bo.cnr.it/corsi-di-info...32Virtual.html 
				__________________ Un wormhole (buco di tarlo, in italiano), detto anche Ponte di Einstein-Rosen, è una ipotetica caratteristica topologica dello spaziotempo che è essenzialmente una "scorciatoia" da un punto dell'universo a un altro, che permetterebbe di viaggiare tra di essi più velocemente di quanto impiegherebbe la luce a percorrere la distanza attraverso lo spazio normale. Go to a Wormhole | 
|   |   | 
|  02-11-2008, 20:14 | #9 | |
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | Quote: 
 | |
|   |   | 
|  02-11-2008, 20:36 | #10 | 
| Senior Member Iscritto dal: Jan 2002 Città: Germania 
					Messaggi: 26110
				 | 
		La vtable è strettamente necessaria se e solo se la classe dichiara metodi virtuali.
		 
				__________________ Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys | 
|   |   | 
|  02-11-2008, 20:53 | #11 | 
| Senior Member Iscritto dal: Sep 2004 Città: Interamnia Urbs 
					Messaggi: 2125
				 | 
		
ho quotato parte di ciò che era scritto nel link in cui i metodi virtual erano nella classe base. Una definizione generica.
		 
				__________________ Un wormhole (buco di tarlo, in italiano), detto anche Ponte di Einstein-Rosen, è una ipotetica caratteristica topologica dello spaziotempo che è essenzialmente una "scorciatoia" da un punto dell'universo a un altro, che permetterebbe di viaggiare tra di essi più velocemente di quanto impiegherebbe la luce a percorrere la distanza attraverso lo spazio normale. Go to a Wormhole | 
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 20:31.









 
		 
		 
		 
		









 
  
 



 
                        
                        










