Visualizzazione dei risultati da 1 a 4 su 4

Discussione: [C++] Polimorfismo

  1. #1
    Utente di HTML.it L'avatar di Pacio88
    Registrato dal
    Sep 2007
    Messaggi
    447

    [C++] Polimorfismo

    Ho questo codice che una volta compilato ed eseguito mi da un output "inaspettato".

    codice:
    #include <iostream>
    using namespace std;
     
    class A { 
    protected: 
           int i; 
    public: 
           A(){ i = 0; cout << "A" << endl;} 
           void virtual f() = 0; 
           void stampa(){ cout << "A " << i << endl;} 
    }; 
     
    class B: public A {
          int j; 
    public: 
           B(){ j = 1; cout << "B" << endl;} 
           void f() { cout << j << ' ' << i << endl;} 
           void stampa(){ cout << "B " << j << endl;} 
    }; 
    
    int main() 
    {  
        B* b = new B;
        cout << "Prova:" << endl; 
        b->f(); 
        b->stampa(); 
        return 0;
    }
    L'output di questo programma è il seguente:
    codice:
    [Session started at 2008-12-28 18:13:01 +0100.]
    A
    B
    Prova:
    1 0
    B 1
    
    The Debugger has exited with status 0.
    Mentre io mi sarei aspettato il seguente:
    codice:
    [Session started at 2008-12-28 18:13:01 +0100.]
    A
    B
    Prova:
    1 0
    A 0
    
    The Debugger has exited with status 0.
    Secondo me non essendo definita virtual la funzione stampa nella classe A, dovrebbe essere chiamata quando viene letto l'istruzione b->stampa(). Comunque sicuramente devo avere qualche idea confusa sul polimorfismo pertanto aspetto chiarimenti, grazie come sempre per l'aiuto.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    L'output è corretto. Se non dichiari la funzione virtual, il compilatore semplicemente la esclude dalla vtable di funzioni della classe base che deve richiamare a runtime. Nel tuo caso, le due funzioni stampa di A e B sono a tutti gli effetti due funzioni distinte che il programma richiama senza preoccuparsi di leggere la vtable della classe base.

  3. #3
    Utente di HTML.it L'avatar di sotoli
    Registrato dal
    Mar 2008
    Messaggi
    150
    Ciao....per avere il risultato che ti aspetti il puntatore b deve essere di tipo A*, in questo modo poi facendo puntare b ad un oggetto della classe B (classe derivata di A), accedi alle funzioni virtuali della classe B e a quelle non virtuali della classe A (classe base).

  4. #4
    Giusto per chiarezza, avresti il tuo ouput con:
    Codice PHP:
    int main() 
    {  
        
    A= new B;
        
    cout << "Prova:" << endl
        
    b->f(); 
        
    b->stampa(); 
        return 
    0;


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.