#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;
}