#include <iostream>
/*
A
/ \
B C
\ /
D
*/
using namespace std;
class A
{
public:
virtual string whoami() const
{
return "A";
}
};
class B : public A
{
public:
virtual string whoami() const override
{
return "B";
}
};
class C : public A
{
public:
virtual string whoami() const override
{
return "C";
}
};
class D : public B, public C
{
public:
virtual string whoami() const override
{
return "D";
}
};
int main()
{
D *d = new D;
B *b = d;
C *c = d;
A *b2a = b;
A *c2a = c;
cout << d->whoami() << endl;
cout << b->whoami() << endl;
cout << c->whoami() << endl;
cout << b2a->whoami() << endl;
cout << c2a->whoami() << endl;
delete d;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKLyoKICAgIEEKICAgLyBcCiAgQiAgIEMKICAgXCAvCiAgICBECiovCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQQp7CnB1YmxpYzoKCXZpcnR1YWwgc3RyaW5nIHdob2FtaSgpIGNvbnN0Cgl7CgkJcmV0dXJuICJBIjsKCX0KfTsKCmNsYXNzIEIgOiBwdWJsaWMgQQp7CnB1YmxpYzoKCXZpcnR1YWwgc3RyaW5nIHdob2FtaSgpIGNvbnN0IG92ZXJyaWRlCgl7CgkJcmV0dXJuICJCIjsKCX0KfTsKCmNsYXNzIEMgOiBwdWJsaWMgQQp7CnB1YmxpYzoKCXZpcnR1YWwgc3RyaW5nIHdob2FtaSgpIGNvbnN0IG92ZXJyaWRlCgl7CgkJcmV0dXJuICJDIjsKCX0KfTsKCmNsYXNzIEQgOiBwdWJsaWMgQiwgcHVibGljIEMKewpwdWJsaWM6Cgl2aXJ0dWFsIHN0cmluZyB3aG9hbWkoKSBjb25zdCBvdmVycmlkZQoJewoJCXJldHVybiAiRCI7Cgl9Cn07CgppbnQgbWFpbigpCnsKCUQgKmQgPSBuZXcgRDsKCUIgKmIgPSBkOwoJQyAqYyA9IGQ7CglBICpiMmEgPSBiOwoJQSAqYzJhID0gYzsKCgljb3V0IDw8IGQtPndob2FtaSgpIDw8IGVuZGw7Cgljb3V0IDw8IGItPndob2FtaSgpIDw8IGVuZGw7Cgljb3V0IDw8IGMtPndob2FtaSgpIDw8IGVuZGw7Cgljb3V0IDw8IGIyYS0+d2hvYW1pKCkgPDwgZW5kbDsKCWNvdXQgPDwgYzJhLT53aG9hbWkoKSA8PCBlbmRsOwoKCWRlbGV0ZSBkOwp9