I find this argument to be fairly weak, personnely. Anything can be made to be good in the hands of a skilled individual. I think it is probably more important to discuss how much work it takes to prove the correctness of something. That way you can avoid how skilled the user of it is and focus on how well the tool solves your problem. Pointers are impossible to prove teh correctness of them when using. I don't mean prove correctness in the mathematical sense (since most programming langauges lack this, except maybe ML's). But rather, how much work it takes to be reasonbly sure you have not commited undefined behavior somewhere. And with pointers you, really, cannot be 100% sure of this. Another problem is, god forbid this magically skilled programmer, makes an error, pointers are very difficult to track down the error and properly solve it.Pointers ARE a good thing in the hands of a skilled programmer.
Polymorphism and inheritence can be implemented without allowing one to perform undefined behavior (i.e safely). Casts do not gurantee you have performed a safe operation, this is why langauges such as ML and python do not have any concept of casting, so i think your comparision is poor.I wouldn't say casting is bad at all -- you might as well say inheritence and polymorphism are bad and don't do either.