The design and implementation of C++ and Objective-C represent different approaches to extending C.
In addition to C’s style of procedural programming, C++ directly supports certain forms of object-oriented programming, generic programming, and metaprogramming. C++ also comes with a large standard library that includes several container classes. Similarly, Objective-C adds object-oriented programming, dynamic typing, and reflection to C. Objective-C does not provide a standard library, per se, but in most places where Objective-C is used, it is used with an OpenStep-like library such as OPENSTEP, Cocoa, or GNUstep, which provide functionality similar to C++’s standard library. Due to dynamic typing, a given Objective-C container class can hold any object type, thus several container classes are not needed.
One notable difference is that Objective-C provides runtime support reflective features, whereas C++ adds only a small amount of runtime support to C. In Objective-C, an object can be queried about its own properties, for example whether it will respond to a certain message. In C++ this is not possible without the use of external libraries.
The use of reflection is part of the wider distinction between dynamic (run-time) features versus static (compile-time) features of a language. Although Objective-C and C++ each employ a mix of both features, Objective-C is decidedly geared toward run-time decisions while C++ is geared toward compile-time decisions. The tension between dynamic and static programming involves many of the classic trade-offs in programming.
Generic programming is implemented and supported differently in each language - in Objective-C it is handled by dynamic typing, whereas in C++ it is handled via templates. Reflection is also a key strategy for metaprogramming.