C++ Herencia

El concepto más importante en la programación orientada a objetos es la herencia. La herencia nos permite definir una clase basándonos en otra clase, lo que facilita la creación y el mantenimiento de una aplicación. De esta manera, también se logra el efecto de reutilizar las funciones del código y mejorar la eficiencia de ejecución.

Al crear una clase, no es necesario volver a escribir nuevos miembros de datos y funciones miembro, solo hay que especificar que la nueva clase hereda los miembros de una clase existente. Esta clase existente se llamaclase base, y la nueva clase se llamaclase derivada。

La herencia representa unais arelación. Por ejemplo, los mamíferos son animales, los perros son mamíferos, por lo tanto, los perros son animales, etc.

El código es el siguiente:

// Clase base
class Animal {
    // Función eat()
    // Función sleep()
};


// Clase derivada
class Dog : public Animal {
    // Función bark()
};

Clase base y clase derivada

Una clase puede derivarse de múltiples clases, lo que significa que puede heredar datos y funciones de múltiples clases base. Para definir una clase derivada, utilizamos una lista de derivación de clases para especificar las clases base. La lista de derivación de clases nombra una o más clases base, con la siguiente forma:

class derived-class: access-specifier base-class

Donde el modificador de acceso access-specifier espublic、protectedoprivateuno de ellos, y base-class es el nombre de una clase definida anteriormente. Si no se utiliza el modificador de acceso access-specifier, el valor predeterminado es private.

Supongamos que hay una clase baseShape,Rectangley que esta es su clase derivada, como se muestra a continuación:

Ejemplo

#include <iostream> using namespace std; // Clase base class Shape { public: void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; }; // Clase derivada class Rectangle: public Shape { public: int getArea() { return (width * height); } }; int main(void) { Rectangle Rect; Rect.setWidth(5); Rect.setHeight(7); // Muestra el área del objeto cout << "Total area: " << Rect.getArea() << endl; return 0; }

Cuando el código anterior se compila y se ejecuta, produce los siguientes resultados:

Total area: 35

Control de acceso y herencia

Una clase derivada puede acceder a todos los miembros no privados de la clase base. Por lo tanto, si no se desea que los miembros de la clase base sean accedidos por las funciones miembro de la clase derivada, deben declararse como private en la clase base.

Podemos resumir los diferentes tipos de acceso según los permisos de acceso, como se muestra a continuación:

Accesopublicprotectedprivate
Misma claseyesyesyes
Clase derivadayesyesno
Clase externayesnono

Una clase derivada hereda todos los métodos de la clase base, excepto en los siguientes casos:

  • El constructor, el destructor y el constructor de copia de la clase base.
  • Los operadores sobrecargados de la clase base.
  • Las funciones amigas de la clase base.

Tipos de herencia

Cuando una clase se deriva de una clase base, esta puede heredarse comopublic、protectedo privatevarios tipos. El tipo de herencia se especifica mediante el modificador de acceso access-specifier explicado anteriormente.

Casi nunca usamosprotectedo privateherencia; normalmente usamospublicherencia. Cuando se utilizan diferentes tipos de herencia, se siguen las siguientes reglas:

  • Herencia pública (public):Cuando una clase se deriva de unabase pública, los miembros de la clase basepúblicostambién son miembros de la clase derivadapúblicos; los miembros de la clase baseprotegidostambién son miembros de la clase derivadaprotegidos; los miembros de la clase baseprivadosno pueden ser accedidos directamente por la clase derivada, pero se puede acceder a ellos mediante losmiembros públicosyy protegidosde la clase base.
  • Herencia protegida (protected):Cuando una clase se deriva de unabase protegida, losmiembros públicosyy protegidosde la clase base se convertirán enmiembros protegidosde la clase derivada.
  • Herencia privada (private):Cuando una clase se deriva de unabase privada, losmiembros públicosyy protegidosde la clase base se convertirán enmiembros privadosde la clase derivada.

Herencia múltiple

La herencia múltiple significa que una subclase puede tener varias clases padre, y hereda las características de múltiples clases padre.

Las clases de C++ pueden heredar miembros de varias clases, con la siguiente sintaxis:

class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类类体>
};

Donde el modificador de acceso (método de herencia) espublic、protectedoprivateuno de ellos, y se utiliza para modificar cada clase base. Las clases base se separan con comas, como se muestra arriba. Ahora veamos juntos el siguiente ejemplo:

Ejemplo

#include <iostream> using namespace std; // Clase base Shape class Shape { public: void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; }; // Clase base PaintCost class PaintCost { public: int getCost(int area) { return area * 70; } }; // Clase derivada 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(); // Muestra el área del objeto cout << "Total area: " << Rect.getArea() << endl; // Muestra el costo total cout << "Total paint cost: $" << Rect.getCost(area) << endl; return 0; }

Cuando el código anterior se compila y se ejecuta, produce los siguientes resultados:

Total area: 35
Total paint cost: $2450
Otras extensiones