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