Four classes (Variable, Function, Factor_Expression, and Float) derive from the class Factor.Code:Term::Term(const Term& t) { std::vector<Factor*> x = t.factors; if (x.empty()) return; Factor* f; for (std::vector<Factor*>::iterator i = x.begin();i != x.end();++i) { if ((*i)->who_am_i() == Factor::FLOATING) { f = new Float(*((Float*)(*i))); factors.push_back(f); } if ((*i)->who_am_i() == Factor::FACTOR_EXPRESSION) { f = new Factor_Expression(*((Factor_Expression*)*i)); factors.push_back(f); } if ((*i)->who_am_i() == Factor::FUNCTION) { f = new Function(*((Function*)*i)); factors.push_back(f); } if ((*i)->who_am_i() == Factor::VARIABLE) { f = new Variable(*((Variable*)*i)); factors.push_back(f); } } }

The goal of this constructor is to create new objects as you can see and put them into a vector array. I'm sure there's a simpler way to do this, something more OOP friendly, but I can't think of it.