// cloner.cpp #include template class clonerBase { public: static clonerBase* Create() { return new T; } virtual void op() { std::cout << "\n Hi from " << typeid(*this).name(); } virtual ~clonerBase() {}; }; class clonerD1 : public clonerBase { public: void op() { std::cout << "\n Hi from clonerD1"; } }; class clonerD2 : public clonerBase { public: void op() { std::cout << "\n Hi from clonerD2"; } }; class clonerD3 : public clonerBase {}; void main() { clonerBase* pD1 = clonerBase::Create(); pD1->op(); clonerBase* pD2 = clonerBase::Create(); pD2->op(); clonerBase* pD3 = clonerBase::Create(); pD3->op(); std::cout << "\n\n"; }