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()?