/* BAD */ class Building { public: Building(); ... protected: ThreeDeeModel model; }; class Barracks : public Building { public: Unit TrainFootman(); Unit TrainRifleman(); Unit TrainKnight(); ... }; class TownHall : public Building { public: Unit TrainPeasant(); ... }; ... class Unit { public: Unit(); ... protected: ThreeDeeModel model; float size; float attackDamage; ... }; /* GOOD */ class Building { public: Building(); Unit TrainUnit(int whichUnit) { return unitPrototypes[whichUnit].Clone(); } ... protected: ThreeDeeModel model; Unit unitPrototypes[4]; int numUnits; }; class Unit { public: Unit(); Unit Clone(); ... protected: ThreeDeeModel model; float size; float attackDamage; ... };