Ciao a tutti ho appena visto una funzione dichiarata come
virtual void nomeFunzione (...
Ma non ho la piu' pallida idea di che cosa sia virtual...
Qualcuno lo sa' ?
Grazie
Ciao a tutti ho appena visto una funzione dichiarata come
virtual void nomeFunzione (...
Ma non ho la piu' pallida idea di che cosa sia virtual...
Qualcuno lo sa' ?
Grazie
Se una classe con una funzione virtual viene ereditata, tale funzione può essere ridefinita.
Esempio:
codice:class Base { public: virtual void funzione() { cout << "In class Base!"; }; class Derivata : public Base { public: // Ridefinisce la funzione! void funzione { cout << "In classe Derived!!! ;-)"; }; void main() { Base o1; Derivata o2; o1.funzione(); o2.funzione(); }
E' solo in C++ ...?
Sì!
Se parli di classi ed ereditarietà è sicuramente C++!
Argh. Immagino stessi scherzando.Originariamente inviato da iguana13
Sì!
Se parli di classi ed ereditarietà è sicuramente C++!
Comunque una virtual non e' propriamente cio' che hai detto tu.
Specificare in una classe una funzione virtual significa comunicare al compilatore di non aspettarsi un'implementazione di quella funzione PER QUELLA classe, similmente all'abstract di Java.
L'implementazione dovra' essere invece definita dalle classi derivate.
Da cio' si capisce come la keyword "virtual" possa essere utilizzata per la creazione di interfacce.
ChReAn
-------------------
Slackware 9.1 powered
Quelle a cui ti riferisci ChReAn sono le funzioni virtuali pure, cioè qualcosa tipoIn quel caso non è possibile instanziare la classe che contiene tale funzione (e tale classe prende il nome di classe astratta).codice:virtual void miafunzione() = 0;
Tramite le funzioni virtuali, più in generale, puoi dare al tuo programma un comportamento polimorfico.
Metti che hai una classe base astratta Forma, che implementa la funzione disegna() come virtuale pura (sarebbe assurdo istanziare un oggetto di tipo Forma, troppo generico), e poi da Forma erediti Retta, Quadrato e Cerchio, e in ognuna di queste classi ridefinisci disegna() disegnando la figura corrispondente.
Puoi creare un puntore ad un oggetto di tipo Forma ("Forma *f;") e poi assegnargli un oggetto di tipo Cerchio, o Quadrato, o Retta ("f = new Cerchio()"). Quando successivamente chiami f->disegna(), a tempo di esecuzione il programma sceglierà dinamicamente quale funzione disegna() chiamare. Senza l'uso della parola chiave virtual, il programma avrebbe chiamato la funzione disegna() della classe base (Forma).
Il vantaggio di questo approccio è che puoi trattare una vasta gamma di oggetti che hanno comportamenti diversi (disegnare un quadrato oppure un cerchio, ecc.) senza necessità di sapere il loro tipo (Quadrato, Cerchio, ecc.).
Esempio: crei un array di puntatori ad oggetti di tipo Forma, l'utente del tuo programma sceglierà come riempire tale array e tu, senza conoscere i vari elementi di questo array, puoi inviargli tramite un ciclo for il messaggio di disegnare se stessi.
Spero di essermi ricordato tutto bene.
Sì, io intendevo le funzioni virtuali "normali", non quelle pure!
Bell'esempio quello delle forme
Io naturalmente intendevo le differenze solo tra C e C++, ovviamente anche in altri linguaggi sono supportati glio oggetti!Argh. Immagino stessi scherzando.
In C invece le classi ed il polimorfismo non esistono, quindi "virtual" è senza dubbio C++ e non C!
Ah ok, ero gia' pronto a scendere in trincea per una bella flame war.Originariamente inviato da iguana13
Io naturalmente intendevo le differenze solo tra C e C++, ovviamente anche in altri linguaggi sono supportati glio oggetti!
In C invece le classi ed il polimorfismo non esistono, quindi "virtual" è senza dubbio C++ e non C!
ChReAn
-------------------
Slackware 9.1 powered
E chiedo venia, avevo considerato solo le virtuali pure.Originariamente inviato da iguana13
Sì, io intendevo le funzioni virtuali "normali", non quelle pure!
Meglio postare alla domenica mattina con le idee chiare che durante la settimana dall'ufficio.
ChReAn
-------------------
Slackware 9.1 powered