// Tcloner.cpp #include #include template class cloner { public: virtual ~cloner() {} virtual T* clone() const=0; }; class base : public cloner { public: base(const std::string& msg) : _msg(msg) {} virtual ~base() {} virtual void say()=0; protected: std::string _msg; }; class derived1 : public base { public: derived1(const std::string& msg) : base(msg) {} base* clone() const { return new derived1(*this); } void say() { std::cout << "\n derived1: " << _msg; } }; class derived2 : public base { public: derived2(const std::string& msg) : base(msg) {} base* clone() const { return new derived2(*this); } void say() { std::cout << "\n derived2: " << _msg; } }; int main() { base* originals[2] = { new derived1("Hi from 1"), new derived2("Hi from 2") }; base* clones[2]; for(int i=0; i<2; ++i) { clones[i] = originals[i]->clone(); delete originals[i]; } for(int i=0; i<2; ++i) { clones[i]->say(); delete clones[i]; } std::cout << "\n\n"; }