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:
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
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:
| Acceso | public | protected | private |
|---|---|---|---|
| Misma clase | yes | yes | yes |
| Clase derivada | yes | yes | no |
| Clase externa | yes | no | no |
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
Cuando el código anterior se compila y se ejecuta, produce los siguientes resultados:
Total area: 35 Total paint cost: $2450Otras extensiones