> * As you said, all Java classes inherit from a common type; java.lang.Object (Smalltalk).
You can limit yourself in C++ to inherit your objects from a common type. I believe that Qt did just that, for example. So this is a subset of C++.
> * Inner classes automatically have a reference to the containing class (not in C++, though Java "nested classes"[1] behave similar to C++ structs/classes).
That's a good example of simple sugar. Inner class just have pointer to the outer class and constructor with this parameter. Java compiler emits this code automatically. Yes, there's no such thing in C++, but it's very simple to emulate.
> * C++ has pass-by-reference semantics which is completely missing in Java.
> * C++ supports destructors intrinsically.
> * All definitions must exist within a type in Java. There is no concept of a "free standing" definition.
> * Java does not support stack-based allocation except for built-in POD's.
Yes, Java is subset of C++ in that regard. C++ has more features which were stripped out.
> * java.lang.ClassLoader has no corresponding abstraction in C++.
> * Java provides meta-objects by way of java.lang.Class for all classes (not present in C++).
Actually those systems could be emulated more or less in C++. Windows does have COM (and there are a lot of less known, but similar systems) which allows to dynamically load classes with virtual methods, etc. Qt implements (with some preprocessor magic) reflection for C++. But generally yes, C++ does not have any kind of runtime reflection (except dynamic_cast) and dynamic code loading, I agree here. What I want to point out is, that those features are provided by JVM. Java as a language does not have anything related to reflection or class loading. So probably it's not fair to compare Java + JVM to C++.
> As an aside, it has always cracked me up that a language touted as having no pointers has a "NullPointerException" class. (I am easily amused)
That's very unfortunate mess of terms. Pointers should be pointers, even if there's no pointer arithmetic in the language. Now we have pointers, references, pass-by-reference and beginners having hard time to understand what that even mean.