However, my point is that the purpose of object oriented programming is the form of encapsulation and extension that the class structure provides.
It is admittedly possible to do in C too, but it's much harder and the language doesn't "help" in this aspect. In more traditional (procedural/functional) programming, any encapsulation done has to be achieved by the programmers direct effort, there is no provision for the compiler to tell the programmer "Look, you are doing it wrong here, you should not use struct X's member variable Y" - C++ has "private" which means that a member variable is not accessible outside of the class - so you can't by mistake "forget to call the appropriate access function".
This only matters if you are writing code that is relatively large (more than a few hundred or thousand lines of code).
Reliability (such as keeping track of memory allocations and other resources) is made easier thanks to the form of constructor/destructor policy that classes provide. There is no need for the programmer [in general] to write a lot of code to handle this. C does not make life so easy here either.
And of course, if you have stupid people, you will end up with stupid code. I have seen a fair number of examples of that in both C and C++ - there is no silver bullet.