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 Dog
clase se deriva de la Animal
clase. Dado que Dog
se deriva de Animal
, los miembros de Animal
son accesibles a Dog
.

Observe el uso de la palabra clave public
al heredar Perro de Animal.
class Dog : public Animal (… );
También podemos usar las palabras clave private
y en protected
lugar de public
. Vamos a aprender acerca de las diferencias entre el uso private
, public
y protected
má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 Dog
se hereda de Animal
.
// Calling members of the Animal class dog1.eat(); dog1.sleep();
Miembros protegidos en C ++
El modificador de acceso protected
es especialmente relevante cuando se trata de la herencia de C ++.
Al igual que los private
miembros, los protected
miembros son inaccesibles fuera de la clase. Sin embargo, se puede acceder a ellos mediante clases derivadas y clases / funciones amigas .
Necesitamos protected
miembros 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 protected
y, por tanto, accesible desde la clase derivada Dog
. Podemos ver esto ya que nos hemos inicializado type
en la Dog
clase usando la función setType()
.
Por otro lado, el private
color 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 protected
palabra clave oculta datos, no podemos acceder al tipo directamente desde un objeto Dog
o Animal
clase.
// 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 public
palabra clave para heredar una clase de una clase base previamente existente. Sin embargo, también podemos usar las palabras clave private
y protected
para 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:
- public: si una clase derivada se declara en
public
modo, los miembros de la clase base son heredados por la clase derivada tal como son. - privado: en este caso, todos los miembros de la clase base se convierten
private
en miembros de la clase derivada. - protected: los
public
miembros de la clase base se conviertenprotected
en miembros de la clase derivada.
Los private
miembros de la clase base siempre están private
en 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 ++