Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    35

    [C++] Esercizio su Ereditarietà della classi

    Ragazzi, guardate questo codice:

    codice:
    #include<iostream>
    
    using namespace std;
    
    class B
    {
    public:
    B();
    B(int n);
    };
    
    B::B()
    
    {
        cout << "B::B()\n";
    }
    
    B::B(int n)
    
    {
    cout<< "B::B("<<n<<")\n";
    }
    
    class C: public B
    {
    public:
    D();
    D(int n);
    
    private:
    B b;
    
    };
    
    C::C()
    {
        cout <<"C::C()\n";
    }
    
    C::C(int n) : B(n)
    
    {
    b=B(-n);
    cout << "C::C("<<n<<")\n";
    }
    
    int main()
    
    {
    C c(3);
    return 0;
    
    }
    L'esercizio mi chiede cosa stampa il programma. Allora io ho ragionato così, C c(3), significa che c è un oggetto della classe C, e a questo oggetto viene assegnato valore 3, quindi sarebbe C::C(int n) : B(n), con n = 3. Prima di tutto, visto che il costruttore di C prevede l'inizializzatore della classe base, verrà visualizzato a schermo cout<< "B::B("<<n<<")\n": quindi B::B(3), poi viene eseguito il codice della funzione:

    {b=B(-n);
    cout << "C::C("<<n<<")\n";
    }

    quindi b = B(-3) e il programma dovrebbe stampare B::B(-3) e infine C::C(3)

    Però compilando ed eseguendo il prgramma ottengo le seguenti stampe:

    B::B(3)
    B::B()
    B::B(-3)
    C::C(3)

    Perchè viene stampato anche B::B()?

  2. #2
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Ciao ... Non ti dimenticare che hai anche un oggetto di tipo B (b) ...
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    35
    Ciao ... Non ti dimenticare che hai anche un oggetto di tipo B (b) ...
    Si, ok, ma perchè viene chiamato anche il costruttore di default della classe base? In teoria il costruttore di default dovrebbe essere chiamato se il costruttore della classe base viene omesso, ma in questo caso c'è, infatti: C::C(int n) : B(n), quindi non capisco... Se qualcuno può gentilmente spiegarmi...

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    35
    Nessuno?

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Semplicemente prima viene costruito l'oggetto b col suo costruttore di default, poi nel costruttore di C gli assegni una copia di B inizializzata a -n
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

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.