Ereditarietà dei costruttori?

di il
2 risposte

Ereditarietà dei costruttori?

Salve,

non riesco a capire il concetto di ereditarietà dei costruttori in c++.
Quando creo una sottoclasse, questa cosa eredita dalla classe padre? Da quanto ho capito eredita i campi, ma non il costruttore, che quindi deve essere creato ad hoc... ma il nostro professore ci dice anche che viene ereditato un costruttore senza parametri dalla superclasse. Perche?
Capisco che la domanda è un po' confusa, ma è perchè sono io che ho le idee confuse, ma ringrazio tutti quelli che risponderanno

2 Risposte

  • Re: Ereditarietà dei costruttori?

    Ogni classe necessita' di almeno un costruttore.

    Se non viene esplicitamente dichiarato, il compila crea un costruttutore di default, che non fa nulla e che non richiede nessun parametro:
    
    struct S { };
    
    e' equivalente a
    
    struct S {
       S(){ }
    };
    
    Ovviamente, se viene indicato un costruttore, di qualunque tipo, il compilatore non crea il costruttore di default.

    Ogni costruttore di una classe derivata, per prima cosa chiama deve chiamare il costruttore della classe base.

    Se non esplicitamente indicato, il compilatore aggiunge la chiamata al costruttore di default della classe base.

    Questo implica che se la classe base non ha definito il costruttore di default, ma un'altro costruttore, e nella classe derivata non viene indicato esplicitamente quale costruttore della classe base chiamare, verra' generato un errore:
    
    struct B
    {
        B(int i) { }
    };
    
    struct D : public B
    {
        D() { }
    };
    
    /*
     * 
     */
    int main(int argc, char** argv) {
    
        D d;
        return 0;
    }
    
    
  • Re: Ereditarietà dei costruttori?

    Quindi se io dico esplicitamente alla sottoclasse quale costruttore usare, il problema non può mai verificarsi? ad esempio:
    
    class persona{
    protected:
    int eta;
    char nome[30];
    public:
    	persona(int age, char name[]){
    		eta = age;
    		strcpy(nome, name);
    	}
    };
    
    class studente: public persona{
    protected:
    int media_voti;
    public:
    	studente(int age, char name[], int media):persona(age, name){
    		media_voti = media;
    	}
    };
    
    se io quindi uso la questa sintassi (per specificare esplicitamente il costruttore da usare):
    
    studente(int age, char name[], int media):persona(age, name)
    
    in questo modo si evita il problema in tutti i casi, o ci sono dei casi in cui tale sintassi non è corretta?

    P.S.
    E' giusto :persona(age, name) oppure deve essere :persona(int age, char name[])?
Devi accedere o registrarti per scrivere nel forum
2 risposte