I recommend using data to define the behaviour of entities rather than code.
E.g. if you have a "bad guy", a "really bad guy" and a "whimp" enemy entities, and define C++ classes to handle each of these, you can't change their behaviour without recompiling, and adding new enemy types becomes a real pain. On the other hand, if you define each type of enemy through a number of properties such as "strength", "moral", "movementspeed", "weapon", "IQ" etc., you only need one piece of code to handle all enemy types, and you can change their behaviour on the fly.
Obviously, there are hybrids, but I'd lean toward more data, and less code when defining behaviour.
/Niels