//abstract.cpp

#include<iostream.h>

class B
{public:
  virtual void f() = 0;
};

class D : public B
{public:
  void f() { cout << "D::f()\n"; }
};

void g1(B* b) { cout << "g2()\n"; }; //OK

//void g1(B b) {}; //ERR non posso construire oggetti B

void main () {
  B* pb = new D;  //OK perche' derivazione pubblica!
  pb -> f();      //Invoca D::f(), essendo B::f() virtuale.
  g2(pb);
//B* pbb = new B; //ERR non posso construire oggetti B
}

/*output:
  D::f()
  g1()
*/
