#include <iostream>
using namespace std;

class X {

protected:
  int i;

 public:
  X() { i = 10; }

  void set(int ii) { 
     cout << "This is X::set" << endl;
     i = ii; }

  int read() const { return i; }

  int permute() { 
         cout << "Printing from X::permute: " << i << endl; 
         return i = i * 47; }
};


class Y : public X {
  int i; 

public:
  Y() { i = 0; }

  int change() {
    i = permute(); // Different name call
    return i;
  }

  void set(int ii) {
    i = ii;
    X::set(ii); // Same-name function call
    cout << "This is Y::set" << endl;
  }

  void print() const { 
         cout << "X::i " << X::i << endl;
//        cout << "X::i " << read() << endl;
//        cout << "X::i " << X::read() << endl;
         cout << "Y::i " << i << endl; }
};



int main() {
/*
  cout << "sizeof(X) = " << sizeof(X) << endl;
  cout << "sizeof(Y) = "
       << sizeof(Y) << endl;
*/
  Y D;

/*
  D.change();
  D.print();
*/

/*
  D.permute();
  D.print();
*/

/*
  D.X::set(12);
  D.set(12);
  D.print();
*/

}

