The previous example doesn't really show the polymorphism. This example shows the coolness of C++ (version 14):
#include <iostream> #include <vector> #include <memory> // Require C++ version 14 to compile! class Base { public: Base(Base & other); Base(Base *); Base(char const * const tag, char const * const desc) : m_tag(tag), m_desc(desc) {} ~Base() = default; void print(); virtual void Process(); public: std::string m_tag = ""; std::string m_desc = ""; }; Base::Base(Base & rhs) { m_tag = rhs.m_tag; m_desc = rhs.m_desc; } Base::Base(Base *pOther) { m_tag = pOther->m_tag; m_desc = pOther->m_desc; } void Base::print() { std::cout << __FUNCTION__ << "(" << this << "): Base::m_tag = " << m_tag << std::endl << " Base::m_desc = " << m_desc << std::endl; } void Base::Process() { std::cout << __PRETTY_FUNCTION__ << std::endl; } template <class CNAME> Base* createClass(char const *const tag, char const * const desc) { CNAME * pObj = new CNAME(tag,desc); std::cout << "Inside " << __FUNCTION__ << "(): "; pObj->Process(); return dynamic_cast<Base*>(pObj); } template <class CNAME> std::unique_ptr<Base> createUniqueClass(char const *const tag, char const *const desc) { std::unique_ptr<Base> obj(createClass<CNAME>(tag, desc)); return obj; } class KelasA : public Base { public: KelasA(char const * const tag, char const * const desc) : Base(tag, desc) {} void Process() override; }; void KelasA::Process() { std::cout << __PRETTY_FUNCTION__ << std::endl; } class KelasB : public Base { public: KelasB(char const * const tag, char const * const desc) : Base("B", desc) {} void Process() override; }; void KelasB::Process() { std::cout << __PRETTY_FUNCTION__ << std::endl; } int main() { std::vector<std::unique_ptr<Base>> vb; vb.push_back(createUniqueClass<KelasA>("A", "Kelase A-1")); vb.push_back(createUniqueClass<KelasB>("B", "Kelase B-1")); //for(auto v = vb.begin(); v != vb.end(); v++)a for(auto & v : vb) { v->Process(); v->print(); } return 0; }