Sigh. Dude, the ship has sailed on this one. C programmers have been writing OO code for decades. Just do some googling, read the book "OO in ANSI C", and stop being so contumaciously contrarian.
Doesn't seem like you know. So you have a structure that holds a pointer to a function. You have to set it to the correct function for each "object." (1st potential error)
Same as C++, just choose a named method table, in the same way as you would name an instance's class. This can be generated by an object factory or constructor function.
To use it you have to dereference a pointer.
Same as C++ for virtual functions. If the -> syntax offends you, it can easily be wrapped in a method that takes the object as a parameter.
No that isn't a method intrinsically tied to its object, it's just procedural programming. You have to manually pass the structure or a pointer. (2nd potential error)
Of course they're tied together, the method only operates on objects of that type (determined by the first parameter usually). In C++ this parameter is just in a different place.
You don't have inheritance so have to use containment instead. Quite cumbersome and counter intuitive to OOP.
Of course there is inheritance (just create a function table which is a copy of the old one and overwrite the methods you want to change, and ignore the the methods you want to inherent). You don't need object containment either, a simple set of macros containing attribute lists will allow you to define inheritance in much the same way as C++.
You might as well use separate procedures. Oh and don't forget to update that function pointer if necessary. (3rd potential error) No you don't have an object, you have a structure.
Update function pointer? Why would that be necessary - only the table pointer needs to be set per object, same as C++.
Yes that is the point of OOP. It's behind the scenes so most associations happen automatically exposing you to less errors. It's object oriented because you're thinking of objects and not data structures that have to be procedurally manipulated.
No, that is the point of C++/Java/C#/etc. OOP is a paradigm - being "behind the scenes" has nothing to do with using the paradigm - you can shout that this isn't so from the rooftops all you want, but the world disagrees with you. I've worked in several OO C code bases before, and there is no conceptual difference to the model, and from the caller/API user's perspective, the syntax is actually pretty damn clean. No, overall I don't think C's OO syntax is particularly awesome, but fortunately I know the difference between syntax and semantics.