#include <iostream>

class A {
public: virtual void blah() { std::cout << "in a" << std::endl; }
        void dupa() { std::cout << "dupA" << std::endl; }
};

class B : public A {
public: void blah() { std::cout << "in b" << std::endl; }
        void dupa() { std::cout << "dupB" << std::endl; }
};

class C : public B {
public: void blah() { std::cout << "in c" << std::endl; }
        void dupa() { std::cout << "dupC" << std::endl; }
};

int main()
{
  A *a = new A;
  B *b = new B;
  C *c = new C;

  std::cout << "normal calls: " << std::endl;
  a->blah();
  a->dupa();
  b->blah();
  b->dupa();
  c->blah();
  c->dupa();

  std::cout << "b casted to a: " << std::endl;
  a = static_cast<A*>(b);
  a->blah();
  a->dupa();

  std::cout << "c casted to a: " << std::endl;
  a = static_cast<A*>(c);
  a->blah();
  a->dupa();

  std::cout << "c casted to b: " << std::endl;
  b = static_cast<B*>(c);
  b->blah();
  b->dupa();

  return 0;
}

