You're not casting properly.
Add another virtual method to Defense _before_ doDefense and you'll see that when you try to call doDefense like that you get a segfault. It was calling doOffense because doOffense happened to be in the same place in memory as where it was looking for doDefense.
Edit:
Your inheritance tree could look more like:
Code:
class Player;
class Offense : public Player;
class Defense : public Player;
class Human : public Player;
class Computer : public Player;
class OffenseHuman : public Offense, public Human;
class DefenseHuman : public Defense, public Human;
class OffenseComputer : public Offense, public Computer;
class DefenseComputer : public Defense, public Computer;
Although if you have a variable of type Player* you can't call doOffense and doDefense methods on it because you don't know whether its an Offense or Defense or either.
Do you need to Offense and Defense to be two separate classes? Because in your code all Players are both anyway.