Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Lenguaje C

Modelos de herencia en C++: múltiple, multinivel y jerárquica

Modelos de herencia en C++: múltiple, multinivel y jerárquica

En este tutorial exploramos los patrones de herencia en C++: múltiple, multinivel y jerárquica, con ejemplos de código prácticos.

La herencia es una característica fundamental de la programación orientada a objetos. Permite a los desarrolladores crear nuevas clases que heredan propiedades y comportamiento de las existentes.

A continuación examinamos tres modelos clave de herencia disponibles en C++.


Herencia multinivel en C++

En una jerarquía multinivel, una clase deriva de otra clase derivada. La cadena continúa hasta alcanzar una clase base.

class A {
    // Implementación de clase base
};
class B : public A {
    // B hereda de A
};
class C : public B {
    // C hereda de B
};

Aquí, B hereda de A, y C hereda de B, formando una cadena de herencia vertical.

Ejemplo 1: Herencia multinivel en C++

#include <iostream>
using namespace std;

class A {
public:
    void mostrar() {
        cout << "Contenido de la clase base." << endl;
    }
};

class B : public A {};

class C : public B {};

int main() {
    C obj;
    obj.mostrar();
    return 0;
}

Salida

Contenido de la clase base.

Este programa demuestra que un objeto de C puede invocar mostrar() definido en la clase base final A porque no existe implementación de sobreescritura en B o C. El compilador resuelve la llamada buscando en la cadena de herencia desde la clase más derivada hacia arriba.


Herencia múltiple en C++

C++ permite que una clase herede de más de una clase base. Por ejemplo, un Murciélago puede derivar tanto de Mamífero como de AnimalAlado porque un murciélago es simultáneamente un mamífero y una criatura alada.

Modelos de herencia en C++: múltiple, multinivel y jerárquica

Ejemplo 2: Herencia múltiple en C++

#include <iostream>
using namespace std;

class Mamifero {
public:
    Mamifero() {
        cout << "Los mamíferos pueden dar a luz directamente." << endl;
    }
};

class AnimalAlado {
public:
    AnimalAlado() {
        cout << "Los animales alados pueden aletear." << endl;
    }
};

class Murcielago : public Mamifero, public AnimalAlado {};

int main() {
    Murcielago b1;
    return 0;
}

Salida

Los mamíferos pueden dar a luz directamente.
Los animales alados pueden aletear.

Resolviendo ambigüedad en herencia múltiple

Cuando dos clases base proporcionan una función con el mismo nombre, el compilador no puede decidir cuál invocar, lo que lleva a un error de ambigüedad.

class Base1 {
public:
    void algunaFuncion() { /* ... */ }
};

class Base2 {
public:
    void algunaFuncion() { /* ... */ }
};

class Derivada : public Base1, public Base2 {};

int main() {
    Derivada obj;
    // obj.algunFuncion(); // Error: ambiguo
}

Use el operador de resolución de ámbito para especificar la función de la clase base deseada:

int main() {
    Derivada obj;
    obj.Base1::algunaFuncion(); // Llama a la implementación de Base1
    obj.Base2::algunaFuncion(); // Llama a la implementación de Base2
}

Herencia jerárquica en C++

En la herencia jerárquica, varias clases derivadas heredan de una sola clase base. Todos los atributos y comportamiento comunes se encapsulan en la clase base, mientras que cada clase derivada puede añadir su propia especialización.

Ejemplos incluyen Física, Química y Biología derivando de Ciencia; y Perro, Gato, Caballo derivando de Animal.

Sintaxis de herencia jerárquica

class ClaseBase {
    // Contenido de la clase base
};
class DerivadaUno : public ClaseBase {
    // Miembros adicionales
};
class DerivadaDos : public ClaseBase {
    // Miembros adicionales
};
class DerivadaTres : public ClaseBase {
    // Miembros adicionales
};

Ejemplo 3: Herencia jerárquica en C++

// Programa en C++ demostrando herencia jerárquica
#include <iostream>
using namespace std;

// Clase base
class Animal {
public:
    void info() {
        cout << "Soy un animal." << endl;
    }
};

// Clase derivada 1
class Perro : public Animal {
public:
    void ladrar() {
        cout << "Soy un Perro. Guau guau." << endl;
    }
};

// Clase derivada 2
class Gato : public Animal {
public:
    void maullar() {
        cout << "Soy un Gato. Miau." << endl;
    }
};

int main() {
    // Instancia Perro
    Perro perro1;
    cout << "Clase Perro:" << endl;
    perro1.info();
    perro1.ladrar();
    
    // Instancia Gato
    Gato gato1;
    cout << "\nClase Gato:" << endl;
    gato1.info();
    gato1.maullar();
    return 0;
}

Salida

Clase Perro:
Soy un animal.
Soy un Perro. Guau guau.
Clase Gato:
Soy un animal.
Soy un Gato. Miau.

Tanto Perro como Gato heredan el método info() de Animal, mientras que cada clase introduce su propio comportamiento especializado.

Lenguaje C

  1. Clases y objetos en C#: Fundamentos para POO robusta
  2. Dominando clases y métodos abstractos en C#: Guía práctica
  3. Entendiendo clases y métodos parciales en C#
  4. Dominando clases y métodos sealed en C#: Cuándo usarlos, ejemplos claros y mejora de seguridad y rendimiento
  5. Clases y Objetos en C++: Guía Práctica de Programación Orientada a Objetos
  6. Herencia en C++: public, protected y private explicados
  7. Funciones y clases amigas en C++: dominando el control de acceso
  8. Struct vs Class en C++: Diferencias Clave, Sintaxis y Mejores Casos de Uso
  9. Entendiendo las Clases de Almacenamiento en C++: Alcance, Vida y Uso
  10. Guía Completa de Fecha y Hora en C++
  11. Entendiendo el Polimorfismo en C++: Guía Práctica