Ver destacados

Trabajando con herencia en C++

Vamos a poner un ejemplo de herencia simple para que veas cómo se trabaja en C++ y uno de herencia múltiple para ver un error que nos puede salir.
Escrito por
22.6K Visitas  |  Publicado ago 24 2016 13:48
Favorito
Compartir
Comparte esta pagina a tus Amigos y Contactos usando las siguientes Redes Sociales


En este tutorial vamos a hablar sobre la herencia en C++, un tema muy interesante, vamos a verlo a través de un ejemplo simple. Para la gente que este en Windows puede descargar un IDE para programar, te ayudara a compilar y ejecutar los programas, dejamos a continuación el enlace:

 

 DEVC++

 

Aquí vamos a utilizar Linux, concretamente Ubuntu, que ya cuenta con un compilador para C++. El lenguaje C++ como probablemente sepa todo el mundo permite la herencia múltiple, a contrario que sucede con Java, que solo permite herencia sencilla y si queremos algo parecido tenemos que tirar de interfaces, al final es menos propenso a errores.

 

El ejemplo principal que vamos a mostrar aquí para ver la herencia en C++ es sencillo, no vamos a meternos en la herencia múltiple, salvo al final para mostrar un error con el que podemos vernos afectados.

 

 

1. Herencia simple en C++


Para empezar el primer ejemplo, herencia simple, tendremos una clase Animal, que será nuestra clase base o padre, y 2 clases que heredarán, Dog que no tendrá nada de código y Cat que añadirá un parámetro nuevo a la clase padre. Veamos el código (es cortito):
#include <iostream>

using namespace std;

class Animal {
  private:
     int age;
  public:
     Animal(int a = 1){
        age = a;
     };
     int getAge() const {return age;}
     void setAge(int a = 9){
        age = a;
     }
};
 
class Dog:public Animal { };

class Cat:public Animal {
  private:
     float weight;
  public:
     Cat(int a = 2, float w = 3.2):Animal(a){
        weight = w;
     }
     float getWeight() const {return weight;}
};

int main(){
    Dog mastin;
    cout << "____DOG____" << endl;
    cout << "Before: " << mastin.getAge() << endl;
    mastin.setAge(2);
    cout << "After: " << mastin.getAge() << endl;
    Cat miau(3, 4.1);
    cout << "____CAT____" << endl;
    cout << miau.getAge() << " " << miau.getWeight() << endl; 
}
Damos por hecho que ya sabéis algo de C++ para pasar a ver temas de herencia, y por lo tanto las partes de funciones o partes públicas y privadas no lo vamos a explicar. Para heredar de una clase tenemos la siguiente sintaxis:
class clase_hija : public clase_padre
Así en nuestro ejemplo para crear la clase Dog hemos usado:
class Dog:public Animal
Indica que Dog hereda de Animal, todo lo que tenga la clase Animal en sus bloques public o protected podremos usarlo, sin embargo si usamos lo del bloque private obtendremos un error. Bueno la clase Dog está vacía, así que no tiene mayor dificultad.

 

Si pasamos a la clase Cat, tenemos la misma declaración de clase que anteriormente, a parte vemos que añade una variable nueva weight, está variable no la tiene ni la clase Animal, ni Dog. Aquí en el constructor de la clase hemos llamado al constructor de la clase padre, así pasamos el dato para la variable age, y además rellenamos la variable weight.

 

Nota
Puedes ver que los parámetros que pasamos a las funciones pueden tener un valor por defecto.

 

En el main creamos un objeto de la clase Dog, dejamos por defecto la edad, y la mostramos, posteriormente hacemos uso de la función setAge para cambiar la edad y la volvemos a mostrar. Finalmente creamos un un objeto de la clase Cat, y esta vez no dejamos que tenga valor por defecto las variables y se las pasamos al crear el objeto, y para no variar las mostramos.

 

Si queremos ejecutar este código en una terminal de Linux con g++, hacemos lo siguiente:

g++ -o test tesc.gcc
Y para ejecutarlo muy fácil:
./test
Vamos a mostrar una captura con la compilación y ejecución del pequeño código:

 

 

 

 

2. Herencia múltiple en C++


Para ver los peligros de la herencia múltiple vamos a dejar un código muy pequeño:
#include <iostream>

using namespace std;

class Animal {
  public:
       void caminar() {
           cout << "Caminando en Animal" << endl;
       }
};

class Mamifero{
  public:
       void caminar() {
           cout << "Caminando en Mamifero" << endl;
       }    
};
 
class Perro:public Animal, public Mamifero { };

int main(){
    Perro dog;
    dog.caminar();
}
Vemos que Perro hereda de Animal y Mamifero, y ambas clases tienen la misma función caminar, si yo hago uso de la función normal como en el código:
dog.caminar()
Y compilamos obtenemos el siguiente error:

 

 

Para solucionarlo podemos utilizar la siguiente sintaxis, para llamar a la función de Animal:

dog.Animal::caminar();
o para usar la de la clase Mamifero:
dog.Mamifero::caminar();
Y por supuesto la mejor solución es no tener 2 funciones con el mismo nombre si vamos hacer uso de la herencia múltiple, en este programa es muy fácil darle solución, pero en uno grande puede convertirse en un quebradero de cabeza.

¿Te ayudó este Tutorial?

Ayuda a mejorar este Tutorial!
¿Quieres ayudarnos a mejorar este tutorial más? Puedes enviar tu Revisión con los cambios que considere útiles. Ya hay 0 usuario que han contribuido en este tutorial al enviar sus Revisiones. ¡Puedes ser el próximo!