Herencia C ++

Uno de los conceptos más importantes de la programación orientada a objetos es el de herencia. La herencia nos permite definir una clase en términos de otra clase, lo que facilita la creación y el mantenimiento de una aplicación. Esto también brinda la oportunidad de reutilizar la funcionalidad del código y el tiempo de implementación rápido.

Al crear una clase, en lugar de escribir miembros de datos y funciones de miembros completamente nuevos, el programador puede designar que la nueva clase debe heredar los miembros de una clase existente. Esta clase existente se llamabase clase, y la nueva clase se conoce como el derived clase.

La idea de herencia implementa la is arelación. Por ejemplo, mamífero IS-A animal, perro IS-A mamífero, por lo tanto perro IS-A animal también y así sucesivamente.

Clases base y derivadas

Una clase puede derivarse de más de una clase, lo que significa que puede heredar datos y funciones de varias clases base. Para definir una clase derivada, usamos una lista de derivación de clases para especificar la (s) clase (s) base. Una lista de derivación de clases nombra una o más clases base y tiene la forma:

class derived-class: access-specifier base-class

Donde el especificador de acceso es uno de public, protected, o private, y base-class es el nombre de una clase previamente definida. Si no se usa el especificador de acceso, entonces es privado por defecto.

Considere una clase base Shape y su clase derivada Rectangle como sigue -

#include <iostream>
 
using namespace std;

// Base class
class Shape {
   public:
      void setWidth(int w) {
         width = w;
      }
      void setHeight(int h) {
         height = h;
      }
      
   protected:
      int width;
      int height;
};

// Derived class
class Rectangle: public Shape {
   public:
      int getArea() { 
         return (width * height); 
      }
};

int main(void) {
   Rectangle Rect;
 
   Rect.setWidth(5);
   Rect.setHeight(7);

   // Print the area of the object.
   cout << "Total area: " << Rect.getArea() << endl;

   return 0;
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

Total area: 35

Control de acceso y herencia

Una clase derivada puede acceder a todos los miembros no privados de su clase base. Por lo tanto, los miembros de la clase base que no deberían ser accesibles para las funciones miembro de las clases derivadas deberían declararse privados en la clase base.

Podemos resumir los diferentes tipos de acceso según - quién puede acceder a ellos de la siguiente manera -

Acceso público protegido privado
Misma clase si si si
Clases derivadas si si No
Clases externas si No No

Una clase derivada hereda todos los métodos de la clase base con las siguientes excepciones:

  • Constructores, destructores y constructores de copia de la clase base.
  • Operadores sobrecargados de la clase base.
  • Las funciones de amigo de la clase base.

Tipo de herencia

Al derivar una clase de una clase base, la clase base puede heredarse a través de public, protected o privateherencia. El tipo de herencia lo especifica el especificador de acceso como se explicó anteriormente.

Apenas usamos protected o private herencia, pero publicla herencia se usa comúnmente. Al usar diferentes tipos de herencia, se aplican las siguientes reglas:

  • Public Inheritance - Al derivar una clase de un public clase base, public miembros de la clase base se convierten public miembros de la clase derivada y protected miembros de la clase base se convierten protectedmiembros de la clase derivada. Una clase baseprivate Los miembros nunca son accesibles directamente desde una clase derivada, pero se puede acceder a ellos a través de llamadas al public y protected miembros de la clase base.

  • Protected Inheritance - Al derivar de un protected clase base, public y protected miembros de la clase base se convierten protected miembros de la clase derivada.

  • Private Inheritance - Al derivar de un private clase base, public y protected miembros de la clase base se convierten private miembros de la clase derivada.

Herencia múltiple

Una clase de C ++ puede heredar miembros de más de una clase y aquí está la sintaxis extendida:

class derived-class: access baseA, access baseB....

Donde el acceso es uno de public, protected, o privatey se dará para cada clase base y estarán separados por comas como se muestra arriba. Probemos con el siguiente ejemplo:

#include <iostream>
 
using namespace std;

// Base class Shape
class Shape {
   public:
      void setWidth(int w) {
         width = w;
      }
      void setHeight(int h) {
         height = h;
      }
      
   protected:
      int width;
      int height;
};

// Base class PaintCost
class PaintCost {
   public:
      int getCost(int area) {
         return area * 70;
      }
};

// Derived class
class Rectangle: public Shape, public PaintCost {
   public:
      int getArea() {
         return (width * height); 
      }
};

int main(void) {
   Rectangle Rect;
   int area;
 
   Rect.setWidth(5);
   Rect.setHeight(7);

   area = Rect.getArea();
   
   // Print the area of the object.
   cout << "Total area: " << Rect.getArea() << endl;

   // Print the total cost of painting
   cout << "Total paint cost: $" << Rect.getCost(area) << endl;

   return 0;
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

Total area: 35
Total paint cost: $2450