////////////////////////////// // MT1Q4.cpp - Base clone #include #include template class B { public: B() : msg("a B message") {} virtual ~B() {} B* clone() { T* pT = dynamic_cast(this); if(!pT) throw std::bad_cast(); return new T(*pT); } virtual void say() const { std::cout << "\n " << typeid(*this).name(); } private: std::string msg; }; class D : public B { public: D(std::string msg) : _msg(msg) {} virtual void say() const { B::say(); std::cout << "\n my string value - " << _msg.c_str(); } private: std::string _msg; }; void main() { B b; b.say(); D d("hi from a D"); d.say(); std::cout << "\n calling clone operation:"; B* pB = d.clone(); pB->say(); std::cout << "\n calling clone operation polymorphically:"; pB = &d; pB = pB->clone(); pB->say(); std::cout << "\n\n"; }