#include <iostream>

class A
{
   int& r_;
public:
   A(int& v) : r_(v) {}
   int& get() { return r_; }
   void operator=(const A& a)
   {
      new(this)A(a.r_);
   }
};

class B : public A
{
   char c_;
public:
   B(int& v, char c) : A(v), c_(c) {}
   char getch() const { return c_; }
   void operator=(const B& b)
   {
      A::operator=((A&)b);
      c_ = b.c_;
   }
};

void test()
{
   int x = 10;
   int y = 20;
   B d(x,'#');
   B e(y, '!');
   d = e;
   ++y;
   std::cout << "x=" << x << "\n"
             << "y=" << y << "\n";
   std::cout << "d.get()=" << d.get()
     << ", d.getch()=" << d.getch() << "\n"
     << "e.get()=" << e.get()
     << ", e.getch()=" << e.getch() << "\n";
}

int main(int argc, char *argv[])
{
   test();
   return 0;
}
