As any C programmer knows, "C++" means "increment C, but use its old value".

For precisely this reason, most C++ programmers deprecate the use of C++ for most purposes, preferring "++C", which can often avoid creation of a temporary.

Regardless of the semantic confusion surrounding the name of the programming language, modern C++ is probably best seen as a "multi-paradigmatic" "no overhead" language.

The OOP features of C++ are probably best-known. Here, too, the "no overhead" rule shows up: virtual functions, polymorphism, and dynamic typing can be used, if explicitly requested. That's because they carry a run time overhead when used. This sets C++ apart from other OO languages like SmallTalk and Java; practitioners of those languages would probably regard only polymorphic inheritance as inheritance. C++ has its uses for non-polymorphic inheritance, creating a more complex language. It's also harder to use, because several OO paradigms are supported, and the programmer must be aware which is in use where.

C++ also supports generic programming. With the STL, C++ can be used as "a better C". But the STL is extensible to use not just its containers and iterators with your algorithms, but also its algorithms with your containers and iterators! All with the "no overhead" rule in place and stronger type checking than is usually possible in container libraries. A vector<C> is not a vector<Object> for some "Object" base class that all objects inherit from. Read more about this: a list of Cars is not a list of Vehicles!

Entirely or almost by accident, the generic programming features of C++ are enough for template meta-programming. The blitz++ numeric library is the best-known examplar of this emerging paradigm.

A synthesis of the various paradigms is now emerging. Andrei Alexandrescu's Modern C++ Design is a superb example of how metaprogramming can be used to implement various design patterns (generically, of course). The "no overhead" rule means you only pay for those features you use; a well-designed application written in C++ will run as well as if it had been written in any other language.

On the other hand, the rampant complexity of the mixture of paradigms exacts a heavy price. The language itself is very complex; features from the different paradigms mix in complicated ways. As a result, there are essentially no mainstream compilers for ISO C++. Understanding modern C++ code requires that the programmer understand not only the features but their uses, in combination with each other, for various patterns. (On the positive side, STL is significantly simpler than similar libraries for other languages and earlier C++ libraries, showing that good design helps here too.)

Why C++ sucks and the C++ programming language freakshow are somewhat less reverent looks at this very topic.