#define SHARED class MyAbstractClass { public: MyAbstractClass(); virtual ~MyAbstractClass() {} virtual void doSomething() = 0; }; class MyDerivedClass : public MyAbstractClass { public: MyDerivedClass(); ~MyDerivedClass(); void doSomething(); }; class MyAbstractFactory { public: MyAbstractFactory(); virtual ~MyAbstractFactory() {} #ifdef SHARED virtual QSharedPointer make() = 0; #else virtual MyAbstractClass* make() = 0; #endif }; class MyDerivedFactory : public MyAbstractFactory { public: MyDerivedFactory(); ~MyDerivedFactory(); #ifdef SHARED QSharedPointer make(); #else MyAbstractClass* make(); #endif };