In what world are the bastardised hybrids of java and C++ traditional OOP languages? They're both C-likes with a limited OO layer tacked on.
The same applies to other class-based OO languages, like Simula or SmallTalk.
Of course all can be solved, but naive OO does not provide tools to do that.
Instead of changing the class of an object (which is impossible), I think it'd be better to haeve a method in monster, "die", that returns an item object (ie a corpse). You can then call the destructor itself or wait for the GC to pick it up.
Now suppose you want to have a Resurrection or Animate Dead spell, and the properties of the animated corpse to be based on the properties of the original dead monster. Then you should copy all the properties of the original monster to the corpse, and after that, properties of the corpse should be copied to the new monster again. Too much duplication for my taste. Also all pointers/links to the old object become invalid instead of pointing to the new one (for some reason IVAN creates a new object when you fix or break a weapon, which makes you lose all the experience with the given weapon if it is broken and fixed, which is weird). Monster death is one of the cases when an object changes into something else, you can also have a polymorph spell or something like that.
IVAN is object oriented, but I do not like the design of it (as it is both object oriented and data driven, which means that both the C++ source and the script defining objects contain definitions of the classes... not nice IMO).
objects that share properties of several classes
In java it'd be better to turn "several classes" into "several interfaces" then there isn't much issue (but here I admit my ignorance of C++)
So let's take a typical example: we have a Creature class, and the following derived classes:
Humanoid (can wield weapons and wear armor)
Equine (can be saddled and wear horseshoes)
Bird (can fly)
Now, you also want to have Centaurs, Angels, and Pegasi. They share properties of several of these classes. AFAIK Java interfaces do not help here, since they just inform the compiler that a given class of objects implements some methods, but it is impossible to share the implementation, or to know whether a given Creature object is flying (or maybe it is possible, but then I think we are using the interface feature not in the way it was designed for).
C++ is a bit better in this, since you have virtual base classes and multiple inheritance, which can be successfully used for this purpose. But these features are rather counter-intuitive (that's why they did not make it into Java), and I still expect some problems when you are e.g. trying to save a file.
objects that change properties of other objects
Let's assume you have somehow successfully managed to include Humanoids, Equines, and Birds in your game. Birds can fly and Humanoids and Equines cannot. Now you want to add winged armors and horseshoes of flying, which allow Humanoids and Equines to fly too. You also want to add the Spell of Gravity which disables the birds' fly ability.
The problem is that in roguelikes objects do not form a strict hierarchy of classes, with properties depending on the class of the given object, but rather may be changed by the environment. (Of course not all roguelikes.)