extern "C"
{
	#include "stdio.h"
}

class Base
{
public:
	virtual int foo(int x, int y) = 0;
	virtual int bar(int x, int y) = 0;
};

class DerivA : public Base
{
	int foo(int x, int y);
	int bar(int x, int y);
public:
	int foobar(int, int);
};

class DerivB : public Base
{
	int foo(int x, int y);
	int bar(int x, int y);
public:
	int a;
	virtual int foobar(int x, int y);
};


// DerivA members

int DerivA::foo(int x, int y)
{
	return x * y + 1;
};

int DerivA::bar(int x, int y)
{
	return x / y - 1;
};

int DerivA::foobar(int x, int y)
{
	return foo(x, y) + bar(x, y);
};


// DerivB members

int DerivB::foo(int x, int y)
{
	return x & y + 1;
}

int DerivB::bar(int x, int y)
{
	return x | y - 1;
}

int DerivB::foobar(int x, int y)
{
	return foo(x, y) - bar(x, y);
}


void main (int argc, char **argv[])
{
	Base *ObjA = (Base *) new DerivA;
	Base *ObjB = (Base *) new DerivB;

	printf ("ObjA->foo(10,3)    = %d\n", ObjA->foo(10,3));
	printf ("ObjA->bar(10,3)    = %d\n", ObjA->bar(10,3));
	printf ("ObjA->foobar(10,3) = %d\n", ((DerivA *)ObjA)->foobar(10,3));
	printf ("ObjB->foo(10,3)    = %d\n", ObjB->foo(10,3));
	printf ("ObjB->bar(10,3)    = %d\n", ObjB->bar(10,3));
	printf ("ObjB->foobar(10,3) = %d\n", ((DerivB *)ObjB)->foobar(10,3));

	delete ObjA;
	delete ObjB;
}
