Non è una scelta così esotica, sono due linguaggi diversi, con due storie diverse e che seguono due approcci differenti per aggiungere caratteristiche di OOP al C.
In estrema sintesi (da qui):
C++ is Bjarne Stroustroup's language based on adding classes and metaprogramming to C in such a way that puts most additional work into the compiler, and relies on least possible effort at runtime.

Objective-C is Brad Cox's language based on adding a SmallTalk-style dynamic message-passing runtime library to C, with a small amount of syntax addition to make it easier to use.
O, più per esteso (da qui):
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.