La programación orientada a objetos no se trata de características de sintaxis, es una filosofía de codificación y diseño. En su núcleo se encuentra el concepto de un objeto , que es una construcción que agrupa el estado con rutinas para actuar sobre él (o, según su punto de vista, las respuestas a los mensajes). El otro aspecto importante de OOP es la encapsulación : envolver detalles de implementación en estructuras opacas y conectarlas a través de interfaces bien definidas. Casi todo lo demás en la teoría OOP se remonta a estos dos fundamentos.
Por lo tanto, cualquier lenguaje que de alguna manera pueda modelar objetos (entidades que contienen datos y código) y la encapsulación se puede usar para hacer POO. Por ejemplo, en C puede usar punteros de función para almacenar funciones en estructuras, y puede usar el sistema de archivos de encabezado / fuente para realizar la encapsulación. No es conveniente, pero es suficiente para hacer POO. Probablemente incluso pueda doblar algo como Haskell o ML para hacer OOP, y no me sorprendería si alguien pudiera encontrar una forma de hacer OOP en conjunto.
Sin embargo, en términos prácticos, un lenguaje puede llamarse 'orientado a objetos' si proporciona un conjunto completo de características de sintaxis para la programación orientada a objetos explícita. Por lo general, esto significa que dicho lenguaje debería tener: * una noción de un objeto * una noción de llamada al método o transmisión de mensajes * una forma cómoda y directa de controlar el acceso a los miembros del objeto * una forma cómoda y sencilla de definir interfaces
En consecuencia, llamaría a un fragmento de código orientado a objetos si se adhiere a los principios de OOP y utiliza la sintaxis de OOP disponible.
Por cierto., El ejemplo de código, probablemente, hace uso de polimorfismo y funciones virtuales, aunque la sintaxis de C no lo hace evidente. No soy un experto en SDL, pero esperaría SDL_surfacepoder representar varios tipos diferentes de superficies, cada una con su propio conjunto específico de implementaciones: colocar algo en un mapa de bits de memoria y hacerlo en una superficie de pantalla requiere radicalmente diferentes código, pero la interfaz (las funciones que toman un SDL_surface*como argumento) sigue siendo la misma. Solo así, también implementa la encapsulación: no puede acceder directamente a la representación subyacente de una superficie, debe pasar por funciones que sepan cómo manejar una SDL_surface, porque eso es todo lo que tiene. Es un buen ejemplo de cómo harías POO en C.