Herencia C ++

En este tutorial, aprenderemos sobre la herencia en C ++ con la ayuda de ejemplos.

La herencia es una de las características clave de la programación orientada a objetos en C ++. Nos permite crear una nueva clase (clase derivada) a partir de una clase existente (clase base).

La clase derivada hereda las características de la clase base y puede tener características adicionales propias. Por ejemplo,

 class Animal ( // eat() function // sleep() function ); class Dog : public Animal ( // bark() function );

Aquí, la Dogclase se deriva de la Animalclase. Dado que Dogse deriva de Animal, los miembros de Animalson accesibles a Dog.

Herencia en C ++

Observe el uso de la palabra clave publical heredar Perro de Animal.

 class Dog : public Animal (… );

También podemos usar las palabras clave privatey en protectedlugar de public. Vamos a aprender acerca de las diferencias entre el uso private, publicy protectedmás adelante en este tutorial.

es una relación

La herencia es una relación es-una . Usamos la herencia solo si existe una relación is -a entre las dos clases.

Aquí hay unos ejemplos:

  • Un coche es un vehículo.
  • La naranja es una fruta.
  • Un cirujano es un médico.
  • Un perro es un animal.

Ejemplo 1: ejemplo simple de herencia de C ++

 // C++ program to demonstrate inheritance #include using namespace std; // base class class Animal ( public: void eat() ( cout << "I can eat!" << endl; ) void sleep() ( cout << "I can sleep!" << endl; ) ); // derived class class Dog : public Animal ( public: void bark() ( cout << "I can bark! Woof woof!!" << endl; ) ); int main() ( // Create object of the Dog class Dog dog1; // Calling members of the base class dog1.eat(); dog1.sleep(); // Calling member of the derived class dog1.bark(); return 0; )

Salida

¡Puedo comer! ¡Yo puedo dormir! ¡Puedo ladrar! ¡¡Guau guau!!

Aquí, dog1 (el objeto de la clase derivada Dog) puede acceder a los miembros de la clase base Animal. Es porque Dogse hereda de Animal.

 // Calling members of the Animal class dog1.eat(); dog1.sleep();

Miembros protegidos en C ++

El modificador de acceso protectedes especialmente relevante cuando se trata de la herencia de C ++.

Al igual que los privatemiembros, los protectedmiembros son inaccesibles fuera de la clase. Sin embargo, se puede acceder a ellos mediante clases derivadas y clases / funciones amigas .

Necesitamos protectedmiembros si queremos ocultar los datos de una clase, pero aún queremos que esos datos sean heredados por sus clases derivadas.

Para obtener más información sobre la protección, consulte nuestro tutorial de modificadores de acceso de C ++.

Ejemplo 2: miembros protegidos en C ++

 // C++ program to demonstrate protected members #include #include using namespace std; // base class class Animal ( private: string color; protected: string type; public: void eat() ( cout << "I can eat!" << endl; ) void sleep() ( cout << "I can sleep!" << endl; ) void setColor(string clr) ( color = clr; ) string getColor() ( return color; ) ); // derived class class Dog : public Animal ( public: void setType(string tp) ( type = tp; ) void displayInfo(string c) ( cout << "I am a " << type << endl; cout << "My color is " << c << endl; ) void bark() ( cout << "I can bark! Woof woof!!" << endl; ) ); int main() ( // Create object of the Dog class Dog dog1; // Calling members of the base class dog1.eat(); dog1.sleep(); dog1.setColor("black"); // Calling member of the derived class dog1.bark(); dog1.setType("mammal"); // Using getColor() of dog1 as argument // getColor() returns string data dog1.displayInfo(dog1.getColor()); return 0; )

Salida

¡Puedo comer! ¡Yo puedo dormir! ¡Puedo ladrar! ¡¡Guau guau!! Soy un mamifero mi color es negro

Aquí, el tipo de variable es protectedy, por tanto, accesible desde la clase derivada Dog. Podemos ver esto ya que nos hemos inicializado typeen la Dogclase usando la función setType().

Por otro lado, el privatecolor variable no se puede inicializar en Dog.

 class Dog : public Animal ( public: void setColor(string clr) ( // Error: member "Animal::color" is inaccessible color = clr; ) );

Además, dado que la protectedpalabra clave oculta datos, no podemos acceder al tipo directamente desde un objeto Dogo Animalclase.

 // Error: member "Animal::type" is inaccessible dog1.type = "mammal";

Modos de acceso en herencia C ++

En nuestros tutoriales anteriores, hemos aprendido sobre los especificadores de acceso de C ++, como público, privado y protegido.

Hasta ahora, hemos utilizado la publicpalabra clave para heredar una clase de una clase base previamente existente. Sin embargo, también podemos usar las palabras clave privatey protectedpara heredar clases. Por ejemplo,

 class Animal ( // code ); class Dog : private Animal ( // code );
 class Cat : protected Animal ( // code );

Las diversas formas en que podemos derivar clases se conocen como modos de acceso . Estos modos de acceso tienen el siguiente efecto:

  1. public: si una clase derivada se declara en publicmodo, los miembros de la clase base son heredados por la clase derivada tal como son.
  2. privado: en este caso, todos los miembros de la clase base se convierten privateen miembros de la clase derivada.
  3. protected: los publicmiembros de la clase base se convierten protecteden miembros de la clase derivada.

Los privatemiembros de la clase base siempre están privateen la clase derivada.

Para obtener más información, visite nuestro tutorial de herencia protegida pública, privada y de C ++.

Anulación de la función de miembro en la herencia

Supongamos que la clase base y la clase derivada tienen funciones miembro con el mismo nombre y argumentos.

Si creamos un objeto de la clase derivada e intentamos acceder a esa función miembro, se invoca la función miembro de la clase derivada en lugar de la de la clase base.

La función miembro de la clase derivada anula la función miembro de la clase base.

Obtenga más información sobre la anulación de funciones en C ++.

Lectura recomendada: herencia múltiple de C ++

Articulos interesantes...