It's funny. What is "i = i*2;"?
In C, it multiplies whatever 'i' is by 2, and 'i' has to be some kind of number, even if it's not something you're supposed to be multiplying.
In C++, you have to look at what class 'i' is defined as, as well as all of the classes it is a child of, as well as any classes it could possibly have been polymorphed from if it's a pointer, (all of which are in completely separate files scattered all across the project) and find out if any of them have a special method for multiplication or equalization, and if more than one does, which one it's ending up using, before you can even begin to understand what it does with that number 2. For all you know, 'i' could be some kind of string and multiplying it by two cleverly makes it all uppercase for no reason, but setting it to another value of its own class frees the memory associated with it before setting it to the new values, which in this case come from that memory itself, causing the whole thing to crash horribly from something that seems so simple, and now you have the task of debugging exactly what the heck went wrong and more than half the code you didn't even write yourself.
C is linear. Simple. Clean. It might not come with immediately advanced support for fancy string conversions and memory management, or functions directly associated with structures with superficial permissions systems (to prevent yourself from messing with your own data 'improperly', as it were...), but it can do what you need as long as you manage everything properly yourself.
C++ mods that to be object-oriented. Literally speaking, its additions center around a concept of "objects", which can come from anywhere, contain anything, and hopefully be completely self-contained, building a program out of many smaller parts that interact, rather than being designed as one solid piece. Unfortunately, they can still end up being far too dependent on eachother regardless, and when an error occurs in one of the pieces, tracking down exactly what happened becomes a vastly more complex affair of figuring out interactions and failures. And just setting up all this complexity of classes and private variables means it takes a lot more time to program even smaller changes and additions, not even mentioning trying to add exception handling.
By most standards you're even expected to make a pair of new files for every new class you add to define it. Imagine if every single object type in SRB2 had its own file? A pair of .cpp and .h files for Blue Crawlas, then another pair for Red Crawlas which derive from it, and then ones for every single type of ring, and ones for every single type of scenery, ... Want to add a new shield to the game? Okay, make a new file and fill out an entire new structure for it, then add the two minor details that make it unique in a function derived from a function that does the rest of the stuff it normally does... Argh!