#include <iostream>

struct A
{
	int x;
	A() : x(1) {}
	A(int X) : x(X) {}
	void DoStuff(){ std::cout<<"A::DoStuff"<<std::endl; }
	virtual void Go(){ std::cout<<"A::Go"<<std::endl; }
	virtual ~A(){}
};
struct B
{
	int x;
	B() : x(2) {}
	void DoStuff(){ std::cout<<"B::DoStuff"<<std::endl; }
	virtual void Go(){ std::cout<<"B::Go"<<std::endl; }
	virtual ~B(){}
};

struct C : A, B
{
	virtual void Go(){ std::cout<<"C::Go"<<std::endl; }
	virtual ~C(){}
};
struct D : A, B
{
	D() : A(4) {}
	using A::Go;
	virtual ~D(){}
};

int main()
{
	using namespace std;

	C c;
//	c.DoStuff(); //error
	c.A::DoStuff();
	c.B::DoStuff();
	c.Go();
	c.A::Go();
	c.B::Go();
//	cout << c.x << endl; //error
	cout << c.A::x << endl;
	cout << c.B::x << endl;

	cout << endl;

	D d;
//	d.DoStuff(); //error
	d.A::DoStuff();
	d.B::DoStuff();
	d.Go();
	d.A::Go();
	d.B::Go();
//	cout << d.x << endl; //error
	cout << d.A::x << endl;
	cout << d.B::x << endl;
}