#include <iostream>

struct Base
{
  virtual void test() { std::cout << "Base" << std::endl; }
};
struct Derived : Base
{
  virtual void test() { std::cout << "Derived" << std::endl; }
};

void f(Base *base) { base->test(); }
void g(Base &base) { base.test();  }
void h(Base base)  { base.test();  }

int main()
{
  Derived d;
  Derived *dp = &d;
  Base    *bp = dp;
  
  f(dp); // Derived
  f(bp); // Derived
  g(d);  // Derived
  h(d);  // Base

  return 0;
}