class P;
  class C;
  
  void f(P* p) { cout << "f(P*)"; } 
(1)
void f(C* c) { cout << "f(C*)"; }
(2)
class P { public: virtual void f() { cout << "P::f"; }
(3)
}; class C : public P { public: virtual void f() { cout << "C::f"; }
(4)
};

slide: Static versus dynamic selection