C++ as defined by the ANSI standard in 1998 (called C++98 at times) is very nearly, but not quite, a superset of the C language as it was defined by its first ANSI standard in 1989 (known as C89). There are a number of ways in which C++ is not a strict superset, in the sense that not all valid C89 programs are valid C++ programs, but the process of converting C code to valid C++ code is fairly trivial (avoiding reserved words, getting around the stricter C++ type checking with casts, declaring every called function, and so on).
In 1999, C was revised and many new features were added to it. As of 2004, most of these new "C99" features are not in C++. Some (including Stroustrup himself) have argued that the changes brought about in C99 have a philosophy distinct from what C++98 adds to C89, and hence these C99 changes are directed towards increasing incompatibility between C and C++.
The merging of the languages seems a dead issue, as coordinated actions by the C and C++ standards committees leading to a practical result did not happen and it can be said that the languages started to diverge.
Some of the differences are:
C++ supports function overloading, this is absent in C, especially in C89 (it can be argued, depending on how loosely function overloading is defined, that it is possible to some degree to emulate these capabilities using the C99 standard).
C++ supports inheritance and polymorphism.
C++ adds keyword class, but keeps struct from C, with compatible semantics.
C++ supports access control for class members.
C++ supports generic programming through the use of templates.
C++ extends the C89 standard library with its own standard library.
C++ and C99 offer different complex number facilities.
C++ has bool and wchar_t as primitive types, while in C they are typedefs.
C++ comparison operators returns bool, while C returns int.
C++ supports overloading of operators.
C++ character constants have type char, while C character constants have type int.
C++ has specific cast operators (static_cast, dynamic_cast, const_cast and reinterpret_cast).
C++ adds mutable keyword to address the imperfect match between physical and logical constness.
C++ extends the type system with references.
C++ supports member functions, constructors and destructors for user-defined types to establish invariants and to manage resources.
C++ supports runtime type identification (RTTI), via typeid and dynamic_cast.
C++ includes exception handling.
C++ has std::vector as part of its standard library instead of variable-length arrays as in C.
C++ treats sizeof operator as compile time operation, while C allows it be a runtime operation.
C++ has new and delete operators, while C uses malloc and free library functions.
C++ supports object-oriented programming without extensions.
C++ does not require use of macros, unlike C, that uses them for careful information-hiding and abstraction (especially important for C code portability).
C++ supports per-line comments denoted by //. (C99 started official support for this comment system, and most compilers support this as an extension.)
C++ register keyword is semantically different to C's implementation.
Features introduced in C++ include declarations as statements, function-like casts, new/delete, bool, reference types, const, inline functions, default arguments, function overloading, namespaces, classes (including all class-related features such as inheritance, member functions, virtual functions, abstract classes, and constructors), operator overloading, templates, the :: operator, exception handling, run-time type identification, and more type checking in several cases. Comments starting with two slashes ("//") were originally part of BCPL, and were reintroduced in C++. Several features of C++ were later adopted by C, including const, inline, declarations in for loops, and C++-style comments (using the // symbol).