#include <iostream>
#include <cstdio>

using namespace std;

struct A
{
    virtual void func()
    {
      printf("i: %d\n", i_);
    }
    void inc()
    {
      ++i_;
    }
    A()
    {
      i_=10;
    }
    private:
      int i_;
};


int main()
{
  void (A::*p)() = &A::func;

  A a;
  (a.*p)();

  unsigned int vptr_addr = *(unsigned int *)&a;
  cout << "vptr_addr:" << hex << vptr_addr << endl;

  unsigned int func_addr = *(unsigned int *)vptr_addr;
  cout << "func_addr:" << hex << func_addr << endl;
  a.inc();
  (*(void(*)(A*))(func_addr) )(&a);

  A aa;
  (*(void(*)(A*))(func_addr) )(&aa);

  (*(void(*)(A*))(func_addr) )(&a);

  (*(void(*)(A*))(func_addr) )(&aa);

  return 0;
}  
