¿Qué es la herencia en la programación orientada a objetos?
La herencia es una de las características más destacadas de la programación orientada a objetos. En C++, la herencia permite a las clases derivar características y comportamientos de una o más clases base, fomentando así la abstracción y relación entre entidades. Imaginemos un sistema en el que las personas puedan ser especializadas como estudiantes o profesores de Platzi. Estos ejemplos de especializaciones heredarían características de una clase base humana, como tener un nombre o una edad.
¿Cómo se implementa la herencia en C++?
Para implementar herencia en C++, se define una clase base que contiene propiedades y métodos que pueden ser heredados por otras clases. Aquí te mostramos cómo hacerlo mediante un ejemplo:
Definición de una clase base
Crearemos una clase Animal
que servirá como base para otras especializaciones. Dentro de esta clase, manejaremos un contador de animales y un método para que los animales "coman".
class Animal {
protected:
std::string alimento;
static int numeroDeAnimales;
public:
Animal() {
númeroDeAnimales++;
std::cout << "Creando un nuevo animal\n";
}
~Animal() {
númeroDeAnimales--;
std::cout << "Borrando animal\n";
}
void comer() {
std::cout << "El animal está comiendo " << alimento << " ñom ñom\n";
}
};
Especialización mediante herencia
A continuación, vamos a crear una clase Herbívoro
que heredará de Animal
. Los herbívoros consumirán plantas o pasto de manera predeterminada.
class Herbivoro : public Animal {
public:
Herbivoro() {
alimento = "pasto";
}
void pastar() {
std::cout << "Este animal está pastando\n";
}
};
Uso de las clases especializadas
Podemos utilizar nuestra clase Herbivoro
para crear instancias y utilizar métodos heredados o específicos.
int main() {
Herbivoro h;
h.pastar();
h.comer();
return 0;
}
¿Qué debemos considerar al usar herencia?
Visibilidad y acceso
Por defecto, los miembros de una clase en C++ son privados. Para permitir que las clases derivadas accedan a estos miembros, podemos declararlos como protected
. Esto permite que las subclases accedan a ellos mientras permanecen inaccesibles desde fuera de la jerarquía de clases.
Herencia pública
Utilizar herencia pública en C++ es crucial cuando deseamos que los métodos y propiedades de la clase base sean accesibles desde las clases derivadas. Esto garantiza que las funcionalidades necesarias se hereden de manera adecuada.
Constructor y destructor
Es necesario explicitar qué constructor se tiene que utilizar cuando las clases derivadas se instancian. Esto se hace llamando al constructor de la clase base dentro de las definiciones del constructor de las clases derivadas, como en el caso del Herbivoro
.
¿Cómo expandir las funcionalidades con herencia múltiple?
La herencia múltiple permite que una nueva clase derive de dos o más clases base. Por ejemplo, podemos crear un Omnívoro
que herede tanto de Herbívoro
como de Carnívoro
, permitiéndole comer tanto carne como plantas. Aunque la implementación exacta no se presenta en el código, el concepto base es claro: la herencia múltiple puede resultar útil para definir clases que cumplan más de una función.
La herencia y especialización de clases en C++ permite una extensa reutilización de código, creando estructuras ricas y bien organizadas. Así podemos modelar de manera efectiva el comportamiento complejo del mundo real dentro de nuestros programas. ¡Continúa explorando las maravillas de la herencia y expande tus horizontes de programación!
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?