#include <iostream>
using namespace std;

class base {
public:
          void Iam()   { cout << "base::Iam()"   << endl; }
  virtual void Iam_v() { cout << "base::Iam_v()" << endl; }
};

class drvd : public base {
public:
  virtual void Iam()   { cout << "drvd::Iam()"   << endl; }
  virtual void Iam_v() { cout << "drvd::Iam_v()" << endl; }
};

class drvddrvd : public drvd {
public:
  virtual void Iam()   { cout << "drvddrvd::Iam()"   << endl; }
  virtual void Iam_v() { cout << "drvddrvd::Iam_v()" << endl; }
};

int main() {
  base b;
  drvd d;
  drvddrvd dd;
  base *pb;
  drvd *pd;

  // static bindings
  b.Iam();     // base::Iam()            1
  b.Iam_v();   // base::Iam_v()          2
  d.Iam();     // drvd::Iam()            3
  d.Iam_v();   // drvd::Iam_v()          4
  dd.Iam();    // drvddrvd::Iam()        5
  dd.Iam_v() ; // drvddrvd::Iam_v()      6

  // dynamic bindings for Iam_v()
  pb = &b ;
  pb->Iam();   // base::Iam()            1
  pb->Iam_v(); // base::Iam_v()          2

  pb = &d;
  pb->Iam();   // base::Iam()            1
  pb->Iam_v(); // drvd::Iam_v()          4

  pb = &dd;
  pb->Iam();   // base::Iam()            1
  pb->Iam_v(); // drvddrvd::Iam_v()      6

  // dynamic bindings now also for Iam()!!
  pd = &d;
  pd->Iam();   // drvd::Iam()            3
  pd->Iam_v(); // drvd::Iam_v()          4

  pd = &dd;
  pd->Iam();   // drvddrvd::Iam()        5
  pd->Iam_v(); // drvddrvd::Iam_v()      6
}