Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    124

    Interpretazione Codice C++

    salve vorrei sapere la differenza tra questi due codici che non riesco a capire qualè?

    perchè l'output del programma A è differente dal programma B ( i programmi differiscono da un solo carattere = & )

    Programma A:
    Codice PHP:
    class CommunicationDevices
    {
    public:
    virtual void which(){
    cout<<"This is a common device..."<<endl;
    }
    };
    class 
    MobilePhoneWithGSMSupport: public CommunicationDevices
    {
    public:
    virtual void which(){
    cout<<"This is a Mobile Phone...GSM Supported"<<endl;
    }
    };
    class 
    MobilePhoneWithCDMASupport: public CommunicationDevices
    {
    public:
    void which(){
    cout<<"This is a Mobile Phone....CDMA Supported"<<endl;
    }
    };
    void whichPhoneUserIsUsing(CommunicationDevices &devices){
    devices.which();
    }
    int main(){
    MobilePhoneWithGSMSupport user1;
    MobilePhoneWithCDMASupport user2;
    whichPhoneUserIsUsing(user1);
    whichPhoneUserIsUsing(user2);


    Programma B:
    Codice PHP:
    class CommunicationDevices
    {
    public:
    virtual void which(){
    cout<<"This is a common device..."<<endl;
    }
    };
    class 
    MobilePhoneWithGSMSupport: public CommunicationDevices
    {
    public:
    virtual void which(){
    cout<<"This is a Mobile Phone...GSM Supported"<<endl;
    }
    };
    class 
    MobilePhoneWithCDMASupport: public CommunicationDevices
    {
    public:
    void which(){
    cout<<"This is a Mobile Phone....CDMA Supported"<<endl;
    }
    };
    void whichPhoneUserIsUsing(CommunicationDevices devices){
    devices.which();
    }
    int main(){
    MobilePhoneWithGSMSupport user1;
    MobilePhoneWithCDMASupport user2;
    whichPhoneUserIsUsing(user1);
    whichPhoneUserIsUsing(user2);

    1° OUTPUT PRIMO PROGRAMMA

    This is a mobile phone... GSM supported
    This is a mobile phone... CDMA supported

    2° OUTPUT SECONDO PROGRAMMA

    This is a common device...
    This is a common device...

    -----------------------------------------

    Non capisco perchè il passaggio tramite puntatore ( &devices ) fa questo effetto sull'output!!

    Grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Se utilizzi come parametro la classe base, il compilatore risolve a "compile time" il simbolo e utilizza il membro della classe base.

    Se utilizzi un puntatore (un passaggio per riferimento), il binding diventa dinamico e la risoluzione del membro virtuale da chiamare avviene solo a run time, tramite l'opportuna vtable della classe derivata usata.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    1
    Nel "Programma B" è vero che alla funzione whichPhoneUserIsUsing(...) passiamo per valore il parametro che ha come tipo la classe base, ma non penso che il compilatore risolva il binding a compile-time. Infatti nel ProgrammaB la funzione which() della classe base è comunque dichiarata virtual, quindi se non mi sbaglio, anche se il parametro lo passiamo per valore, viene in ogni caso consultata la virtual table per la scelta della funzione da eseguire a runtime. Il problema semmai è che il costruttore di copia, vedendo che la funzione si aspetta come parametro un oggetto della classe base, allocherà uno spazio in memoria per contenere un oggetto di quel tipo, anche se poi andiamo a passare un oggetto di una sottoclasse quando la funzione viene chiamata. In questo caso verrà fatto una specie di casting fra il parametro formale nel legame con quello attuale, che porterà in ogni caso l'oggetto devices ad avere come tipo la classe base. Ed è questo che porterà, a runtime, alla scelta della funzione which() della classe base piuttosto che quella della sottoclasse come ci saremmo aspetti (e come sarebbe avvenuto se avessimo passato il parametro per riferimento come nel Programma A). Scusatemi in anticipo se ho detto qualche imprecisione.

  4. #4
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    No se non è un puntatore non c'è il binding dinamico

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 © 2025 vBulletin Solutions, Inc. All rights reserved.