Figure 3 Inlining virtual functions

class Base {
public:
  virtual void print()
    { printf("Base"); }
};

class Derived1 : public Base {
public:
  virtual void print()
    {
// Base::print() can be inlined
      Base::print();
      printf("Derived1");
    }
};

class Derived2 : public Base {
public:
  virtual void print()
    {
// Base::print() can be inlined
      Base::print();
      printf("Derived2");
   }
};

void function(Base *bp)
{
// Doesn't know whether
// to call Derived1::print()
// or Derived2::print(),
// won't inline:
  bp->print();

// Forced to call Base::print(),
// can inline:
  bp->Base::print();
  Derived1 d1o;
// Forced to call
// Derived1::print(), can
// inline:
  d1o.print();
}

// End of File