Métodos
42 (XII): C++, los módulos
De C a C++: clases, herencia, polimorfismo y overload. El cambio de mentalidad después de un año de C estricta.

42 (XIII): C++, los módulos
Después de un año de C estricta, donde nada te dan hecho y cada byte lo gestionas tú, la primera semana de C++ fue un choque extraño: std::cout, std::string, clases que se inicializan solas. Tuve la sensación de hacer trampa. Dos horas después, el compilador ya se había encargado de deshacerme la ilusión.
El problema
El currículum de C++ en 42 llega en diez módulos, cpp00 a cpp09, y no es un curso de sintaxis: es un cambio de mentalidad. En C piensas en funciones y en memoria; en C++ diseñas tipos. Y 42, como siempre, pone reglas que te fuerzan a entender el porqué: nada de printf, nada de malloc, nada de los casts viejos. Si hacías servir C++, tenía que ser C++ de verdad: streams, referencias, y una forma canónica ortodoxa que toda clase debe cumplir —constructor por defecto, constructor de copia, operador de asignación y destructor— para poder copiarse y destruirse sin sorpresas.
Cómo lo abordé
Módulo a módulo, con el Makefile como compañero de viaje. El 00 fueron clases y la forma canónica. El 01, reserva con new y la diferencia real entre punteros y referencias. El 02, sobrecarga de operadores: hacer que una clase se pueda sumar, comparar e incrementar como si fuera un número. El 03, herencia, con la trampa de siempre: qué se hereda y qué no. Y el 04, el que lo ata todo: polimorfismo por subtipado, clases abstractas, y la regla que más me ha marcado —el destructor debe ser virtual, porque si borras un objeto derivado a través de su padre, sin virtual no se libera todo. En el repositorio mis módulos llegan hasta aquí; los últimos, de plantillas y contenedores, los trabajé con material de referencia al lado.
Qué aprendí
Que el C del año anterior no fue un lastre: se sabe qué hace un std::string por dentro cuando has escrito tú el gestor de memoria. Que las referencias no son punteros con modales: son alias con restricciones, y esas restricciones son lo que les da valor. Que heredar es fácil, pero el polimorfismo —un interfaz común que se comporta según el tipo real— es todo el punto del diseño orientado a objetos. Y que ahora un mensaje de error del compilador de C++ de tres líneas me sabe bien: me dice que el tipo me está protegiendo de un bug que en C habría salido a las tres de la madrugada.