Newsgroup: it.comp.lang.c++
Titolo: Classi con metodi virtuali in c++

Salve a tutti,
convinto dalla potenza delle classi virtuali ho provato ad
impementarne un con relative derivate...ma purtroppo l'effetto non è
stato quello previsto.
Prendiamo questo esempio:
//Classe base
class A{
   int var1;
public:
   A(){var1=1;};
   virtual void Metodo(void){var1++;};
};
//Classe derivata
calss B:public A{
public:
   B();
   virtual void Metodo(void){var1+=2};
};
Se io in un ipotetico programma faccio :
B *b = new B;
A *a = b;
a->Metodo(); //Qui dovrebbe essere richiamato il metodo di B o di A?
io credevo di B ma sono stato smentito dalla cruda realtà di un trace
(djgpp + rhide 1.4) in una fase di un debug!
allora poi ho provato a fare una classe con tutti metodi virtuali
senza definire nessuno di essi (clase virtuale pura?).
La mia idea era quella di avere un vettore di puntatori ad oggetti
della classe base e ad essi assegnare i puntatori agli oggetti delle
classi derivate. Poi durante l'esecuzione del programma avrei creato
all'occorrenza gli oggetti necessari (classi derivate) e li avrei
messi nella lista per far eseguire loro le operazioni a cui erano
stati preposti...
Avete capito qualcosa? Spero di si...
Ciao a tutto il NG..
Siderion - " La pianta dell'ingegno non smette mai di germogliare...ma
cerchiamo di aiutarla a non morire! "
Francesco "Foca" Pischedda
Coder - Siderion
Visitate il nostro sito : 
http://digiland.iol.it/Siderion/Index.htm
--
Posted from 
twingo.tiscalinet.it
 [195.130.224.85]
via Mailgate.ORG Server - 
http://www.mailgate.org

A *a = b;
Prova a fare:
A *a = new B;
e vedrai che funziona!
Ciao, Lvca.


e allora? e poi? in che senso? Questa e' l'idea, ma?...Qual'e' il problema
o la
domanda?
                    Guido

 (djgpp + rhide 1.4) in una fase di un debug!
A me non sembra proprio.
Ho ricopiato il tuo programma e (a parte qualche errore di battitura che
ho corretto) l'ho compilato e il metodo che viene chiamato è quello di
B, fortunatamente.
E non ci fare mettere paura. :)
Invece di mettere incrementi dei campi privati mettici una bella
  printf("Io sono A!\n")
nell'implementazione di A.Metodo(), e analogamente per B.
Vedrai che goduria. :)
 
Bye,
Marcello.

 e vedrai che funziona!
In un compilatore C++, NON PUO` esservi alcuna differenza di
comportamento fra le due righe di codice che quoti da Francesco
e la singola riga che proponi tu (a parte, naturalmente, che le
sue producono un'ulteriore variabile b, che comunque non viene
usata, ed e` dunque innocua e rimuovibile dall'ottimizzatore).
Alex

 stati preposti...
La tua idea (in senso generale) e` del tutto corretta.  (Meglio
ancora sarebbe se la generazione degli oggetti concreti fosse
delegata a classi-fabbrica, ma e` un passo successivo).  Senza
dubbio ti imbroglia un qualche minimo dettaglio.
Alex

(djgpp + rhide 1.4) in una fase di un debug!
l'oggetto "a" e' un puntatore a tipo "A" al quale e' stato assegnato un
addr.
Per ottenere quello che vuoi ottenere tu, doversti fare:
A *a = new B;
Solo in questo caso attivi il polimorfismo e l'istruzione
a->Metodo() attivera' una chiamata al "Metodo" definito nella class B.

Nota:  Alle istanze di B, non sara' mai visibile "var1" in quanto private.
Per rendere un dato mebro protetto dall'esterno, ma visibile alle classi
derivate devi
metterlo sotto la sezione "protected".  Tu, non specificando, l'hai
automaticamente messo
sotto "private"
il codice era:


(djgpp + rhide 1.4) in una fase di un debug!
Il post di Alex MArtelli mi ha messo nel dubbio. Allora ho provato, ed il
metodo
chiamato e' stato quello di B.
Conclusioni:  :-)
1) mi sbagliavo (ma comunque il tuo sarebbe un coding poco chiaro, sempre
meglio fare A *a = new B()
2) Ma tu che compilatore usi ??
ciao