#include <iostream>
using namespace std;


class BaseClass {
public:
	BaseClass() { cout << "Constructor BaseClass" << endl; }
	virtual void Tell() { cout << "I'm BaseClass" << endl; }
};

class ClassA: public BaseClass {
public:
			ClassA() { cout << "Constructor ClassA" << endl; }
	void	Tell() { cout << "I'm ClassA" << endl; }
};

class ClassB: public BaseClass {
public:
			ClassB() { cout << "Constructor ClassB" << endl; }
	void	Tell() { cout << "I'm ClassB" << endl; }
};


class BaseFactory {
public:
	BaseFactory() { cout << "BaseFactory constructor" << endl; }
	virtual void		Tell() const { cout << "I'm BaseFactory" << endl; }
	virtual BaseClass * Produce() const { return new BaseClass(); }
};

class FactoryA: public BaseFactory {
public:
				FactoryA() { cout << "FactoryA constructor" << endl; }
	void		Tell() const { cout << "I'm FactoryA" << endl; }
	BaseClass * Produce() const { 
		cout << "FactoryA produce:" << endl;
		return new ClassA(); 
	}
};

class FactoryB: public BaseFactory {
public:
				FactoryB() { cout << "FactoryB constructor" << endl; }
	void		Tell() const { cout << "I'm FactoryB" << endl; }
	BaseClass * Produce() const { 
		cout << "FactoryA produce:" << endl;
		return new ClassB();
	}
};


static BaseFactory * factoryA = new FactoryA();
static BaseFactory * factoryB = new FactoryB();


void CreateSome( BaseClass* &object, const BaseFactory& SomeFactory ) {
	SomeFactory.Tell();
	object = SomeFactory.Produce();
}

int main()
{
	BaseClass* T;
	CreateSome(T, *factoryA);
	T->Tell();
}