Herencia frente a composición: ventajas y desventajas
Compare herencia y composición y elija la herramienta adecuada para el diseño.
Herencia frente a composición: ventajas y desventajas es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.
Dos formas de reutilizar código
Puede reutilizar código heredando de otra clase o componiéndolo como miembro. Ambas opciones tienen su lugar.
Herencia: «es-un»
Utilice la herencia cuando la clase derivada sea realmente un tipo especializado de la clase base.
class Vehicle {};
class Car : public Vehicle {}; // a Car IS a Vehicle
class SportsCar : public Car {};Composición: «tiene-un»
Utilice la composición cuando la relación sea «tiene-un» o «utiliza-un».
class Engine {};
class Car {
Engine engine_; // a Car HAS an Engine
};Equilibrio del acoplamiento
La herencia crea un acoplamiento estrecho: las clases derivadas dependen de los detalles internos de la clase base. La composición mantiene los módulos independientes y facilita su modificación.
Flexibilidad
La composición permite cambiar el comportamiento durante la ejecución: puede sustituir el objeto compuesto. La herencia fija el comportamiento en tiempo de compilación.
class Logger {
std::unique_ptr<LogSink> sink_; // can swap implementations
public:
void setSink(std::unique_ptr<LogSink> s) { sink_ = std::move(s); }
};Pruebas
Los objetos compuestos se pueden sustituir por mocks para las pruebas. Las clases base heredadas son más difíciles de simular sin funciones virtuales o plantillas.
El problema de la clase base frágil
Los cambios en una clase base pueden romper muchas clases derivadas. La composición aísla el cambio en la clase que compone.
Cuándo elegir la herencia
La herencia es adecuada cuando:
- Exista una relación clara de tipo «es-un»
- Se necesite polimorfismo mediante una interfaz base
- La clase base esté diseñada explícitamente para la herencia
Cuándo elegir la composición
La composición es adecuada cuando:
- Quiera flexibilidad para sustituir implementaciones
- La relación sea «tiene-un» o «utiliza-un»
- Quiera un acoplamiento bajo y pruebas más sencillas
El patrón Strategy
Combine composición y polimorfismo: almacene un puntero a la clase base que apunte a un objeto de estrategia que la clase contenedora compone.
class Sorter {
std::unique_ptr<SortStrategy> strategy_;
public:
void sort(std::vector<int>& v) { strategy_->execute(v); }
};Mixins y clases de políticas
Para la personalización en tiempo de compilación, utilice clases de políticas parametrizadas con plantillas: composición en el nivel de tipos. Es una técnica potente, sin sobrecarga en tiempo de ejecución.
Interfaz y composición
Un patrón moderno habitual consiste en definir una interfaz (clase base abstracta) y componer clases concretas que la implementen. Herencia para la interfaz y composición para la implementación.
Comprobación rápida
¿Qué enfoque suele ofrecer más flexibilidad y un acoplamiento más bajo?
Resumen
La herencia modela «es-un» y la composición modela «tiene-un». La composición es más flexible y tiene un acoplamiento menor; prefíerala para reutilizar código. Utilice la herencia para el polimorfismo mediante una interfaz, a menudo combinada con implementaciones compuestas.
Aprende C++ con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 51
- Lecciones
- 203
Preguntas frecuentes
¿La lección «Herencia frente a composición: ventajas y desventajas» es gratis?
Sí — el texto completo de «Herencia frente a composición: ventajas y desventajas» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Herencia frente a composición: ventajas y desventajas»?
Compare herencia y composición y elija la herramienta adecuada para el diseño. Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C++ Academy?
No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Herencia frente a composición: ventajas y desventajas»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C++ Academy?
Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Herencia simple y múltiple
- Funciones virtuales y la vtable
- Clases abstractas y métodos virtuales puros
- Herencia frente a composición: ventajas y desventajas