Chiamate costruttori classi Derivate

di il
5 risposte

Chiamate costruttori classi Derivate

Consideriamo, ad esempio, il seguente codice:

#include <iostream>
using namespace std;

class Uno{
    public:
        int a;
        Uno(){
            a = 1;
            cout<<"Costruttore Uno()"<<endl; }
};

class Due: public Uno{
    public:
        int b;
        Uno u;
        Due(){
            b = 2;
            cout<<"Costruttore Due()"<<endl; }
};

class Tre: public Due{
    int c;
    Due d;
    public:
        Tre(){
            c = 3;
            cout<<"Costruttore Tre()"<<endl; }
};

int main(){
    Tre obj3;
    return 0;
}
L'output di questo codice è il seguente:

Costruttore Uno()
Costruttore Uno()
Costruttore Due()
Costruttore Uno()
Costruttore Uno()
Costruttore Due()
Costruttore Tre()

In generale, quali sono le regole che segue il compilatore per stabilire l'ordine di chiamata dei costruttori?

5 Risposte

  • Re: Chiamate costruttori classi Derivate

    Fai un esempio PIU" semplice e lo scopri da te, OLTRE al fatto che c'e' scritto in QUALUNQUE libro sul C++
  • Re: Chiamate costruttori classi Derivate

    A me interessava capire questo specifico esempio in quanto, a differenza degli esempi semplici, la classe Tre ha tra i membro dato un oggetto classe Due, che a sua volta è una classe derivata e non capisco, in questi casi, l'ordine di chiamata dei costruttori (se viene chiamato prima quello della classe derivata Tre, se viene costruito prima l'oggetto Due d ecc...)
    Nel caso di classi derivate che hanno come membri dato oggetti che a loro volta derivano da altre classi, le regole di chiamata al costruttore non sono cosi semplici e scontate come nei casi semplici
  • Re: Chiamate costruttori classi Derivate

    Suggerimento:
    - usa una variabile globale per tenere conto dell'indentazione
    - mostra un messaggio (indentato) all'inizio del costruttore e aumenta l'indentazione
    - diminuisci l'indentazione e mostra un messaggio alla fine del costruttore
  • Re: Chiamate costruttori classi Derivate

    Anche qui debug step by step e passa la paura, invece non lo fa mai nessuno

    Evidentemente il programmatore medio di C++ passa il tempo a risolvere gli Incroci Obbligati sulla Settimana Enigmistica

    Comunque

    Dichiari un oggetto tre che eredita due che eredita uno, quindi

    Costruttore Uno() --- > questa è la chiamata al costruttore di Uno; tutto ok, si passa a Due
    Costruttore Uno() --- > questa è la chiamata di Due.u
    Costruttore Due() --- > questa è la chiamata al costruttore di Due; tutto ok, si passa a Tre
    Costruttore Uno() --- > questa è la chiamata al costruttore Uno di Tre.d; tutto OK, si passa al costruttore Due di Tre.d
    Costruttore Uno() --- > questa è la chiamata di Tre.d.u
    Costruttore Due() --- > questa è la chiamata al costruttore di Due di Tre.d
    Costruttore Tre() --- > questa è la chiamata al costruttore di Tre
  • Re: Chiamate costruttori classi Derivate

    Weierstrass ha scritto:


    Anche qui debug step by step e passa la paura, invece non lo fa mai nessuno
    Io senza un debugger serio mi sento peggio che nudo...
Devi accedere o registrarti per scrivere nel forum
5 risposte