You can write object-oriented code in C, but no matter what tricks you do with storing function pointers in structs, you still have to pass the struct itself as an explicit argument.
A sprinkle of clang blocks and Block_copy on top of your structs and you’re on your way!