#include <iostream>
using namespace std;
class B1 {
public:
virtual void m1() {
cout << "B1::m1\n";
}
};
class B2 {
public:
virtual void m2() = 0;
};
class I : public B1, public B2 {
public:
virtual void m2() = 0;
};
class D1 : public I {
public:
virtual void m2() {
cout << "D1::m2\n";
}
};
class D2 : public I {
public:
virtual void m2() {
cout << "D2::m2\n";
}
};
class Client {
public:
Client() {
optionD1 = new D1();
optionD2 = new D2();
}
~Client() {
delete optionD1;
delete optionD2;
}
void m3() {
optionD1->m1();
optionD1->m2();
optionD2->m1();
optionD2->m2();
}
private:
I *optionD1;
I *optionD2;
};
int main() {
Client c;
c.m3();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQjEgewpwdWJsaWM6CiAgICB2aXJ0dWFsIHZvaWQgbTEoKSB7IAogICAgCWNvdXQgPDwgIkIxOjptMVxuIjsgCiAgIAl9Cn07CgpjbGFzcyBCMiB7CnB1YmxpYzoKICAgIHZpcnR1YWwgdm9pZCBtMigpID0gMDsKfTsKCmNsYXNzIEkgOiBwdWJsaWMgQjEsIHB1YmxpYyBCMiB7CnB1YmxpYzoKICAgIHZpcnR1YWwgdm9pZCBtMigpID0gMDsKfTsKCmNsYXNzIEQxIDogcHVibGljIEkgewpwdWJsaWM6CiAgICB2aXJ0dWFsIHZvaWQgbTIoKSB7CiAgICAJY291dCA8PCAiRDE6Om0yXG4iOwogICAgfQogICAgCn07CgpjbGFzcyBEMiA6IHB1YmxpYyBJIHsKcHVibGljOgogICAgdmlydHVhbCB2b2lkIG0yKCkgewogICAgCWNvdXQgPDwgIkQyOjptMlxuIjsKICAgIH0KICAgIAp9OwoKY2xhc3MgQ2xpZW50IHsKcHVibGljOgoJQ2xpZW50KCkgewoJCW9wdGlvbkQxID0gbmV3IEQxKCk7CgkJb3B0aW9uRDIgPSBuZXcgRDIoKTsKCX0KCX5DbGllbnQoKSB7CgkJZGVsZXRlIG9wdGlvbkQxOwoJCWRlbGV0ZSBvcHRpb25EMjsKCX0KCXZvaWQgbTMoKSB7CgkJb3B0aW9uRDEtPm0xKCk7CgkJb3B0aW9uRDEtPm0yKCk7CgkJb3B0aW9uRDItPm0xKCk7CgkJb3B0aW9uRDItPm0yKCk7Cgl9CnByaXZhdGU6CiAgICBJICpvcHRpb25EMTsKICAgIEkgKm9wdGlvbkQyOwp9OwoKaW50IG1haW4oKSB7CglDbGllbnQgYzsKCWMubTMoKTsKCXJldHVybiAwOwp9