Herencia C++
Herencia de 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í, el Dog
la clase se deriva del Animal
clase. Desde Dog
se deriva de Animal
, miembros de Animal
son accesibles para Dog
.
Observe el uso de la palabra clave public
mientras hereda Perro de Animal.
class Dog : public Animal {...};
También podemos usar las palabras clave private
y protected
en lugar de public
. Aprenderemos sobre las diferencias entre usar 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 una es-una relación está presente entre las dos clases.
Estos son algunos ejemplos:
- Un automóvil 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 C++
// C++ program to demonstrate inheritance
#include <iostream>
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
I can eat! I can sleep! I can bark! Woof woof!!
Aquí, perro1 (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 de C++
El modificador de acceso protected
es especialmente relevante cuando se trata de la herencia de C++.
Me gusta private
miembros, protected
los miembros son inaccesibles fuera de la clase. Sin embargo, se puede acceder a ellos mediante clases derivadas y clases/funciones de amigos .
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 Modificadores de acceso de C++.
Ejemplo 2:Miembros protegidos de C++
// C++ program to demonstrate protected members
#include <iostream>
#include <string>
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
I can eat! I can sleep! I can bark! Woof woof!! I am a mammal My color is black
Aquí, la variable tipo es protected
y por lo tanto es accesible desde la clase derivada Dog
. Podemos ver esto ya que hemos inicializado type
en el Dog
clase usando la función setType()
.
Por otro lado, el private
variable color 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, desde el protected
palabra clave oculta datos, no podemos acceder a type directamente desde un objeto de Dog
o Animal
clase.
// Error: member "Animal::type" is inaccessible
dog1.type = "mammal";
Modos de acceso en herencia C++
En nuestros tutoriales anteriores, aprendimos sobre los especificadores de acceso de C++, como público, privado y protegido.
Hasta ahora, hemos usado el public
palabra clave para heredar una clase de una clase base existente previamente. Sin embargo, también podemos usar el private
y protected
palabras clave 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:
- público: Si una clase derivada se declara en
public
modo, entonces 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 en
private
miembros de la clase derivada. - protegido: El
public
los miembros de la clase base se convierten enprotected
miembros de la clase derivada.
El private
los miembros de la clase base siempre son private
en la clase derivada.
Para obtener más información, visite nuestro tutorial de herencia pública, privada y protegida de C++.
Reemplazo de función miembro en 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++
Lenguaje C