Newsgroup: it.comp.lang.c++
Titolo: Funzioni virtuali e funzioni virtuali pure

Fra pochi giorni ho un esame e vorrei chiedervi delle conferme.
Ho una classe base con due classi da essa derivate pubbliche.
Se nella classe base inserisco un metodo virtuale puro (cioè con =0) dovrò
farne l'overriding in ambedue le classi derivate per renderle concrete. Se
per esempio facessi l'overriding in una sola delle due classi, l'altra
resterebbe astratta e non potrei istanziare oggetti di tale classe.
Se invece definisco un metodo virtuale semplice nella classe base, ho il
limite di doverne dare una definizione anche nella classe base, sennò il
linker si incazza.
Confermate queste mie conclusioni?
A volte mi servirebbe un metodo virtuale nella classe base, definito in UNA
SOLA delle classi derivate e senza definizione nella classe base, ma non a
districarmi con eleganza dovendo creare dei metodi fittizi che non credo
piaceranno molto alla prof...
Chi mi illuminerà riceverà la mia stima sempiterna.

Fra pochi giorni ho un esame e vorrei chiedervi delle conferme.
Ho una classe base con due classi da essa derivate pubbliche.
Se nella classe base inserisco un metodo virtuale puro (cioč con =0) dovrņ
farne l'overriding in ambedue le classi derivate per renderle concrete. Se
per esempio facessi l'overriding in una sola delle due classi, l'altra
resterebbe astratta e non potrei istanziare oggetti di tale classe.
Se invece definisco un metodo virtuale semplice nella classe base, ho il
limite di doverne dare una definizione anche nella classe base, sennņ il
linker si incazza.
Confermate queste mie conclusioni?
A volte mi servirebbe un metodo virtuale nella classe base, definito in UNA
SOLA delle classi derivate e senza definizione nella classe base, ma non a
riesco a
districarmi con eleganza dovendo creare dei metodi fittizi che non credo
piaceranno molto alla prof...
Chi mi illuminerą riceverą la mia stima sempiterna.
P.S scusate il msg di prima era incomprensibile (non che questo...)

 fittizi che non credo piaceranno molto alla prof...
Mi puoi fare un esempio concreto di una situazione del genere ? Non riesco a
capire. Grazie
--
imho

 piaceranno molto alla prof...
Non riesco a immaginare come sia possibile che tu abbia una siffatta
esigenza.
Se una classe ha un certo metodo e deve essere instanziabile, quel metodo
deve poter essere invocato, quindi dotato di una qualche implementazione. Se
quel metodo non serve a niente, allora la classe non è un'espressione
sensata dell'interfaccia definita dalla classe base.
Se sei certo che nessuno invocherà quel metodo in una particolare classe
derivata, dovrai essere altrettanto certo che nessuno invocherà quel metodo
tramite puntatore a classe base; quindi non ha alcun senso che quel metodo
sia dichiarato nella classe base.
Max

 che non credo piaceranno molto alla prof...
Sono suo compagno di corso e ti garantisco che farla contenta è dura.
Ho provato a proporle le stesse tue argomentazioni ma non c'è verso.
I suoi esempi e i suoi esami sono alquanto oscuri. Sul testo scrive
"risolvere usando la struttura dati più adatta". Poi ti dice che se non usi
una lista polimorfica ti abbassa il voto. Ovviamente tale scelta è tra le
soluzioni peggiori per quel determinato esercizio ma non ha importanza
perchè secondo lei "è l'unica soluzione possibile".
Per dare una risposta all'op:
quando ti trovi in quelle condizioni fai il metodo non virtuale puro ma
semplicemente con il corpo vuoto:
virtual void merlino() {}
virtual int grandepuffo() {return 0;}
sicuramente non è un gran che ma credo che la prof lo voglia così.

 sicuramente non č un gran che ma credo che la prof lo voglia cosě.

 Comunque grazie mille a tutti!
Scusa, allora, per quanto sia una schifezza:
potresti avere una classe base senza tali metodi.
una derivata da quella base senza tali metodi.
una derivata da quella base che introduce tali metodi in forma pura e
virtuale (astratta).
una derivata da quest'ultima che implementi ed usi tali metodi.
Occhio, questa soluzione e' pessima e l'ho data solo per motivi di
brainstorming per mettere una pezza al problme che propone l'op. Poi, il
modo adatto per risolvere il problema sarebbe cambiare il design!
La classe astratta risulta perfettamente *inutile*, cosi' come il
comportamento polimorfico, ma.... se e' questo che devi fare, in questo modo
eviti "{return "ERRORE!";}" e porcherie simili....
Ora pero' ho da porvi una domanda... Sicuri di aver letto bene la traccia ed
aver inteso bene quello ce intende la prof.?!?
Per quanto i prof vivano nel loro mondo fatto di vita "fittizzia, colori e
tanta felicita'", sembra strano che abbia chiesto qualche cosa completamente
cosi' senza senso...
Tommy

> farò così! Comunque grazie mille a tutti!


 cosi' senza senso...
L'ha messo proprio in chiaro. Tutti i suoi testi di esame richiedono una
classe base coi dati comuni e due derivate che introducono nuovi dati e una
lista polimorfica che contiene puntatori alla classe base.
Siccome per l'elaborazione della lista che il testo richiede tu avrai
bisogno di accedere ai dati specifici delle classi derivate avrai bisogno di
accedere, partendo da un base* ai dati delle derivate (senza usare RTTI, che
lei non ha spiegato e credo non conosca)
Per la soluzione, nel suo esempio in classe, lei vuole che tu dichiari per
ogni dato membro delle due derivate che ti serviranno nell'elaborazione un
metodo virtuale nella classe base. E' per questo che l'op non sa bene cosa
farne di questo metodo, è virtuale ma ha significato solo per una delle due
classi derivate.

 
Non sono sicuro di aver capito il problema, ma se ben capito (scuas il gioco
di parole) la soluzione è semplice: basta creare un ulteriore livello di
gerarchia.
Chiamiamo l'interfaccia della tua classe base come A, ESCLUDENDO però i
metodi Get e Set (cioè la classe A non li definisce nemmeno come  virtuali
puri). Dalla classe A, fai derivare la classe B che ha come unici membri due
funzioni virtuali pure: Get e Set. A questo pto se devi usare una classe che
usi i metodi Get e Set, la fai derivare da B, se invece tale classe concreta
non deve avere Get e Set, essa deriverà direttamente da A. Se questa
soluzione ti va bene, spero di non aver fatto tardi e di averti impedito di
commettere l'obbrobrio relativo al return "ERRORE" :)