#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEEKewoJaW50IHg7CglBKCkgOiB4KDEpIHt9CglBKGludCBYKSA6IHgoWCkge30KCXZvaWQgRG9TdHVmZigpeyBzdGQ6OmNvdXQ8PCJBOjpEb1N0dWZmIjw8c3RkOjplbmRsOyB9Cgl2aXJ0dWFsIHZvaWQgR28oKXsgc3RkOjpjb3V0PDwiQTo6R28iPDxzdGQ6OmVuZGw7IH0KCXZpcnR1YWwgfkEoKXt9Cn07CnN0cnVjdCBCCnsKCWludCB4OwoJQigpIDogeCgyKSB7fQoJdm9pZCBEb1N0dWZmKCl7IHN0ZDo6Y291dDw8IkI6OkRvU3R1ZmYiPDxzdGQ6OmVuZGw7IH0KCXZpcnR1YWwgdm9pZCBHbygpeyBzdGQ6OmNvdXQ8PCJCOjpHbyI8PHN0ZDo6ZW5kbDsgfQoJdmlydHVhbCB+Qigpe30KfTsKCnN0cnVjdCBDIDogQSwgQgp7Cgl2aXJ0dWFsIHZvaWQgR28oKXsgc3RkOjpjb3V0PDwiQzo6R28iPDxzdGQ6OmVuZGw7IH0KCXZpcnR1YWwgfkMoKXt9Cn07CnN0cnVjdCBEIDogQSwgQgp7CglEKCkgOiBBKDQpIHt9Cgl1c2luZyBBOjpHbzsKCXZpcnR1YWwgfkQoKXt9Cn07CgppbnQgbWFpbigpCnsKCXVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoJQyBjOwovLwljLkRvU3R1ZmYoKTsgLy9lcnJvcgoJYy5BOjpEb1N0dWZmKCk7CgljLkI6OkRvU3R1ZmYoKTsKCWMuR28oKTsKCWMuQTo6R28oKTsKCWMuQjo6R28oKTsKLy8JY291dCA8PCBjLnggPDwgZW5kbDsgLy9lcnJvcgoJY291dCA8PCBjLkE6OnggPDwgZW5kbDsKCWNvdXQgPDwgYy5COjp4IDw8IGVuZGw7CgoJY291dCA8PCBlbmRsOwoKCUQgZDsKLy8JZC5Eb1N0dWZmKCk7IC8vZXJyb3IKCWQuQTo6RG9TdHVmZigpOwoJZC5COjpEb1N0dWZmKCk7CglkLkdvKCk7CglkLkE6OkdvKCk7CglkLkI6OkdvKCk7Ci8vCWNvdXQgPDwgZC54IDw8IGVuZGw7IC8vZXJyb3IKCWNvdXQgPDwgZC5BOjp4IDw8IGVuZGw7Cgljb3V0IDw8IGQuQjo6eCA8PCBlbmRsOwp9