Herencia y polimorfismo
Clases que heredan de otras, métodos virtuales, clases abstractas, slicing y la vtable por dentro.
13 aulas · 10 horas de práctica · en el navegador, sin instalar nada
Temario
- Clase base y derivada — Una clase que hereda de otra tiene todo lo de la otra y suma lo suyo. Un Avion ES una Aeronave: la torre que sabe atender aeronaves lo atiende sin cambiar una línea.
- protected y constructores en cadena — La base se construye primero: el constructor de la derivada le pasa sus datos en la lista de inicialización. Y protected: lo que ven las derivadas pero no el resto del mundo.
- virtual y override — Sin virtual, una Robot& llama siempre al paso() de Robot. Con virtual, llama al del objeto de verdad: eso es el polimorfismo. override hace que el compilador revise que de verdad estés reemplazando algo.
- Clases abstractas — Un método virtual puro (= 0) no tiene versión en la base: cada derivada tiene que escribirlo, y la base no se puede crear. Es la forma de decir "esto es un molde, no un robot".
- Destructor virtual (y el leak si falta) — delete por un puntero a la base corre el destructor de la base... y el de la derivada solo si el de la base es virtual. Si no, lo que la derivada tenía en el heap queda huérfano.
- Polimorfismo con un vector de punteros — Barcos de formas distintas en un mismo vector<Barco*>: el disparo le pregunta a cada uno, sin saber cuál es. Sumar un tipo nuevo es escribir una clase, sin tocar el resto.
- Taller: el ejército de enemigos — Soldados, tanques blindados y búnkeres en un mismo vector<Enemigo*>: cada uno con su forma y su resistencia, y un loop de disparos que no pregunta qué es cada uno.
- Slicing: el objeto rebanado — Copiar una derivada en una base se queda solo con la parte de la base: se pierden los campos y los overrides de la derivada. Pasa en parámetros por valor, en vector<Base> y en returns por valor.
- La vtable por dentro — Cómo sabe un Animal* que es un Perro: cada clase con virtuales tiene una tabla de funciones, y cada objeto lleva un puntero escondido a la de su clase. Lo construís a mano, como en C, y lo medís con sizeof.
- Herencia múltiple e interfaces — Una interfaz es una clase con solo virtuales puros: un contrato. Una clase puede cumplir varios (heredar de varias bases). Y el rombo: cuando dos bases comparten un abuelo, herencia virtual para que haya uno solo.
- final y diseño de jerarquías — final cierra una clase (nadie hereda de ella) o un método (nadie lo vuelve a sobrescribir). Y cómo pensar una jerarquía: heredar solo cuando la derivada ES la base y se puede usar en su lugar.
- Composición o herencia — Un robot no ES un motor: TIENE un motor. Componer (objetos adentro de objetos) es más flexible que heredar: se puede tener dos de algo, cambiar una pieza en el camino y mostrar solo lo que hace falta.
- Taller: torre de control con varias aeronaves — Aviones, vuelos sanitarios, planeadores y un helicóptero de rescate piden pista. Cada clase dice su prioridad, la torre ordena sin preguntar qué es cada uno, y hay que cazar el slicing que la deja ciega.