#include <iostream>
using namespace std;

class B{
	int b;
	protected:
	void fB(){cout<<"fB();";}
	public:
	B(int i){b=i;cout<<"B(int)b="<<b<<";";}
	B(){b=0;cout<<"B()b="<<b<<";";}
	B(const B&x){b=x.b;cout<<"B(B&)b="<<b<<";";}
	~B(){cout<<"~B();";}
	void gB(){cout<<"gB();";}
};

class D:public B{
	int d;
	protected:
	void fD(){fB();cout<<"fD();";//cout<<"b="<<b<<";";
	}
	public:
	D(int i):B(i){d=i;cout<<"D(int)d="<<d<<";";}
	D(){d=0;cout<<"D()d="<<d<<";";}
	D(const D& x){d=x.d;cout<<"D(D&)d="<<d<<";";}
	~D(){cout<<"~D();";}
	void gD(){fD();cout<<"gD();";}
};

main(){
	D d1;//B()b=0 D()d=0
	D d2(2);//B(int)b=2 D(int)d=2
	//D d3(1,2);//error
	d1=d2;
	D d4=d1;//B()b=0 D(D&)d=2
	//d4.fD();//error
	//d1.fB();//error
	d4.gD();//fB() fD()b=0 gD()
	d1.gB();//gB()
}
