#include	<iostream>

struct A {
	virtual void hello() = 0;
};

struct B : public A {
	virtual void hello() { std::cout << "I'm B" << std::endl; }
};

struct C : public A {
	virtual void hello() { std::cout << "I'm C" << std::endl; }
};

int
main()
{
	A  a_object	// Illegal!
		
	A *a;		// Okay.

	a = new A;	// Illegal!

	a = new B;	// Okay
	a->hello();	// "I'm B"

	a = new C;	// Okay
	a->hello();	// "I'm C"
}
