Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C++] Virtual Void...?

    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

  2. #2
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    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();
    }

  3. #3
    E' solo in C++ ...?

  4. #4
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Sì!

    Se parli di classi ed ereditarietà è sicuramente C++!

  5. #5
    Utente di HTML.it L'avatar di ChReAn
    Registrato dal
    Aug 2002
    Messaggi
    486
    Originariamente inviato da iguana13
    Sì!

    Se parli di classi ed ereditarietà è sicuramente C++!
    Argh. Immagino stessi scherzando.

    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

  6. #6
    Quelle a cui ti riferisci ChReAn sono le funzioni virtuali pure, cioè qualcosa tipo
    codice:
    virtual void miafunzione() = 0;
    In quel caso non è possibile instanziare la classe che contiene tale funzione (e tale classe prende il nome di classe astratta).

    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.

  7. #7
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Sì, io intendevo le funzioni virtuali "normali", non quelle pure!

    Bell'esempio quello delle forme

    Argh. Immagino stessi scherzando.
    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!


  8. #8
    Utente di HTML.it L'avatar di ChReAn
    Registrato dal
    Aug 2002
    Messaggi
    486
    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!

    Ah ok, ero gia' pronto a scendere in trincea per una bella flame war.
    ChReAn
    -------------------

    Slackware 9.1 powered

  9. #9
    Utente di HTML.it L'avatar di ChReAn
    Registrato dal
    Aug 2002
    Messaggi
    486
    Originariamente inviato da iguana13
    Sì, io intendevo le funzioni virtuali "normali", non quelle pure!
    E chiedo venia, avevo considerato solo le virtuali pure.

    Meglio postare alla domenica mattina con le idee chiare che durante la settimana dall'ufficio.
    ChReAn
    -------------------

    Slackware 9.1 powered

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.