t is an uninitialised pointer. It could contain any random address.
Therefore *t = T; this assignment is updating the memory location pointed to by that same pointer. This is the cause of the error.
You could fix this by putting t = new ImOk;
before attempting to use the pointer.
If you do so, there should be a corresponding delete t; in the destructor of class Dude.
Alternatively, you could put t = &T; instead of *t = T;
In this case, the pointer t instead of pointing to its own independent object, is pointing to the parameter T, which in turn represents the object named mk.