We can categorize programming languages in many different ways. If we examine the kinds of problems they solve and the ways they calculate the solutions, two distinct approaches emerge, and we can further divide the second approach into three separate subcategories:
Programs based on the imperative paradigm perform computations based on state changes (where a program's state is its current condition or activity, and is determined by the values stored in all its variables at any given time). Simply put, imperative programs calculate values and store the values into variables for later use. Declarative programs focus on the computation logic rather than on the flow of data - these programming languages do not make assignments to variables. Declarative "languages are 'higher level' than imperative languages, in that the programmer operates more remotely from the CPU itself" (Appleby and VandeKopple, 1997, p. 9).
Programs written in imperative languages (like Java and C++) consist of a sequence of statements, where each statement is an instruction that causes the computer to do one operation. Statements, and therefore programs, are composed of a pattern of keywords, symbols, and programmer-named entities. The pattern that defines a correct program represents the programming language's syntax.
C++ is an imperative programming language that traces its lineage to FORTRAN, the first high-level programming language.
Programming languages are often described as high-level or low-level. High-level programming languages are (mostly) independent of the hardware. Programmers can move hardware-independent code from one computer to another fairly easily. High-level languages include features that reflect or align with elements of the problem domain. These features make it easier for computer scientists to solve problems with computer programs.
Low-level languages are very dependent on the computer hardware, so it takes much more effort for programmers to move the source code from one computer to another. Being tied to the hardware means that low-level languages reflect the primitive operations that the hardware can perform rather than providing the features that clearly and easily represent a problem.
The C programming language is deemed a mid-level language because it allows programmers more access to the hardware than other, higher-level languages. But it also provides the problem-centered constructs seen in high-level programming languages. We can locate C++ at two different places in this spectrum. First, it represents a mid-level language because it retains C's access to the hardware. But second, it also represents a high-level language because it supports object-orientation, a problem-centered approach to programming. The combination of high- and mid-level features makes C++ a popular choice for writing games, operating systems, and large applications.
C is a nearly perfect subset of C++, meaning that (with few obscure exceptions) a C++ compiler can compile a correct C program. C++ extends the C programming language by adding:
Appleby, D. and VandeKopple, J.J. (1997). Programming Languages: Paradigm and Practice (2nd Ed). The McGraw-Hill Companies, Inc., New York.