Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Lenguaje C

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:


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:

  1. 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.
  2. privado: En este caso, todos los miembros de la clase base se convierten en private miembros de la clase derivada.
  3. protegido: El public los miembros de la clase base se convierten en protected 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

  1. Palabra clave estática de C#
  2. Clase anidada de C#
  3. Operadores de C++
  4. Clases y objetos de C++
  5. Herencia pública, protegida y privada de C++
  6. Plantillas de clase de C++
  7. Herencia de Python
  8. Clases de almacenamiento en C++
  9. Polimorfismo en C++
  10. Abstracción de datos en C++
  11. Encapsulación de datos en C++