Before I leave the topic of objects in Lisp vs. C++, I’ll bring up one more remarkable feature of Lisp. This probably belongs to the category of things the C++ programmer never even imagined was a possibility.
It is possible, in a running Lisp instance, to redefine a class. That is, the programmer can decide that a class was incorrectly implemented, and that it has to be redefined. In this event, the programmer can supply code that lazily converts objects from the old class definition to the new one, without exiting the running instance. Rather than describing the mechanics of this, I refer the interested reader to this page from the Common Lisp HyperSpec.
For a long-running, stateful C++ program, redefining classes would require saving state to disc, shutting down the binary, then starting the new binary and having it reload its state into the new classes. It’s fairly remarkable that Lisp allows the programmer to define the conversion in the running core, so that it can simply lazily convert objects as they are encountered, allowing the program to continue running without interruption.