Two of the problems you mention are caused because C++ is all about performance. Any language
feature that will slow things down requires the programmer to explicitly use it.
Array new is a separate function because it has to store the number of elements in the memory
allocation. Making new and array new the same would waste a size_t for every alloc.
Virtual has to be specified because it slows down the function calls.
I have personal recent experience with virtual. I used virtual functions in an interface base
class. After I got done profiling, I did explicit calls to class functions instead of
virtuals in the derived classes and one use of dynamic_cast and then using the pointers with a
template function. The code was over 20 times faster.
The real killer wasn't the indirect jump, it was how virtuals block inlining and most compiler
optimization, since it can't know what function will really be called.