#include <iostream>
using namespace std;
class A {
int num;
public:
int get_num() const { cout<<"get_num for "<<(void*)this<<endl; return num; }
};
class B : public A {
void foob() { int x = get_num(); }
};
class C { // won't inherit from A anymore
const A& base; // instead keeps a reference to A
void fooc() { int x = base.get_num(); }
public:
explicit C(const A* b) : base(*b) { } // receive reference to A
void show_oops() { fooc(); }
};
class D : public B, public C {
void food() { int x = get_num(); }
public:
D() : C(this) { } // pass "this" pointer
void show() { food(); }
};
int main() {
D d;
cout<<"d is "<<(void*)&d<<endl;
d.show();
d.show_oops();
D d2=d;
cout<<"d2 is "<<(void*)&d2<<endl;
d2.show();
d2.show_oops();
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQSB7CiAgaW50IG51bTsKcHVibGljOgogIGludCBnZXRfbnVtKCkgY29uc3QgeyBjb3V0PDwiZ2V0X251bSBmb3IgIjw8KHZvaWQqKXRoaXM8PGVuZGw7IHJldHVybiBudW07IH0KfTsKCmNsYXNzIEIgOiBwdWJsaWMgQSB7CiAgdm9pZCBmb29iKCkgeyBpbnQgeCA9IGdldF9udW0oKTsgfQp9OwoKY2xhc3MgQyB7IC8vIHdvbid0IGluaGVyaXQgZnJvbSBBIGFueW1vcmUKICBjb25zdCBBJiBiYXNlOyAvLyBpbnN0ZWFkIGtlZXBzIGEgcmVmZXJlbmNlIHRvIEEKICB2b2lkIGZvb2MoKSB7IGludCB4ID0gYmFzZS5nZXRfbnVtKCk7IH0KcHVibGljOgogIGV4cGxpY2l0IEMoY29uc3QgQSogYikgOiBiYXNlKCpiKSB7IH0gLy8gcmVjZWl2ZSByZWZlcmVuY2UgdG8gQQogICB2b2lkIHNob3dfb29wcygpIHsgZm9vYygpOyB9Cn07CgpjbGFzcyBEIDogcHVibGljIEIsIHB1YmxpYyBDIHsKICB2b2lkIGZvb2QoKSB7IGludCB4ID0gZ2V0X251bSgpOyB9CnB1YmxpYzoKICBEKCkgOiBDKHRoaXMpIHsgfSAvLyBwYXNzICJ0aGlzIiBwb2ludGVyCiAgdm9pZCBzaG93KCkgeyBmb29kKCk7IH0KfTsKCmludCBtYWluKCkgewoJRCBkOwoJY291dDw8ImQgaXMgICI8PCh2b2lkKikmZDw8ZW5kbDsgCglkLnNob3coKTsKCWQuc2hvd19vb3BzKCk7CglEIGQyPWQ7Cgljb3V0PDwiZDIgaXMgICI8PCh2b2lkKikmZDI8PGVuZGw7IAoJZDIuc2hvdygpOwoJZDIuc2hvd19vb3BzKCk7CgkKCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCXJldHVybiAwOwp9