cpp

Herencia de clases en C++

Continuando con la programación orientada a objetos en C++ hoy vamos a ver cómo funciona la herencia de clases, con algunos ejemplos.

Recordemos que, en C++, cuando una clase extiende de otra, la misma hereda sus métodos y propiedades, exceptuando el constructor.

También vamos a ver cómo sobrescribir métodos de la clase padre.

Nota: antes de que leas sobre la herencia, mira los principios de la programación orientada a objetos en C++.

Extender de otra clase en C++

Para definir que una clase extiende de otra, se usan los dos puntos:

class NombreDeClase: NombreDeLaClasePadre{};

Se puede extender de varias clases:

class NombreDeClase: NombreDeUnaClase, NombreDeOtraClase{};

Llamar a métodos de la clase padre

Si los métodos de la clase son marcados como públicos o protegidos, se puede acceder a ellos a través de this.

Sobrescribir métodos

Para sobrescribir métodos dentro de una clase padre, los mismos deben ser declarados como virtuales con la palabra virtual. Por ejemplo:

virtual void nombreDelMetodo(){};

De esta manera, en la clase hija se sobrescribe con la palabra override:

void nombreDelMetodo override(){}

Obviamente el método debe tener el mismo nombre, número de argumentos y valor de retorno.

Llamar al constructor padre

Se puede llamar al constructor padre, para ello primero se debe definir un constructor en la clase hija.

Por ejemplo:

ConstructorDeLaClaseHija(int argumento1) : ConstructorDeLaClasePadre(argumento1){};

Fíjate que el constructor de la clase padre no indica el tipo de dato, solo el nombre de la variable.

Vas a entender mejor con el código.

Hablar es de mal gusto, muéstrame el código

Ahora veamos el código de todo lo que hemos explicado sobre la herencia de clases en C++

Dentro del código se refleja el acceso a las propiedades y métodos definidas en la clase padre, así como un ejemplo para sobrescribir métodos.

#include <iostream>
class Persona {
 private:
  std::string nombre;
  int edad;

  void metodoPrivado() {
    std::cout << "Solo puedo ser llamado desde dentro de la clase";
  }

 public:
  // Constructor sin argumentos
  Persona() {
    std::cout << "Se llama al constructor";
    this->metodoPrivado();
  }
  // Constructor con nombre y edad
  Persona(std::string nombre, int edad) {
    this->edad = edad;
    this->nombre = nombre;
  }

  int getEdad() { return this->edad; }

  void setEdad(int edad) { this->edad = edad; }

  std::string getNombre() { return this->nombre; }

  void setNombre(std::string nombre) { this->nombre = nombre; }

  void saludar() {
    std::cout << "Hola, me llamo " << this->nombre << " y mi edad es "
              << this->edad << "\n";
  }
  // Definido virtual para que se pueda sobrescribir ;)
  virtual void saludarAmigo(std::string nombre) {
    std::cout << "Hola " << nombre << ", me llamo " << this->nombre
              << " y mi edad es " << this->edad << "\n";
  }
};

class Estudiante : public Persona {
 public:
  // Constructor vacío
  Estudiante(std::string nombre, int edad, std::string escuela)
      : Persona(nombre, edad) {}

  // Definir propios métodos
  void estudiar() { std::cout << "*estudia*\n"; }
  // Sobrescribir otros
  void saludarAmigo(std::string nombre) override {
    // Usamos getEdad y getNombre porque es una subclase
    // y las variables son privadas
    std::cout << "Qué onda " << nombre << ", me llamo " << this->getNombre()
              << " y mi edad es " << this->getEdad() << "\n";
  }
};

int main() {
  Persona p1("Luis", 21);
  p1.saludar();
  Persona p2;
  p2.setEdad(1);
  p2.setNombre("John Galt");
  p2.saludar();
  Estudiante e1("Luis", 3, "Ninguna");
  e1.saludar();
  e1.saludarAmigo("Pedro");
  e1.estudiar();
}

La definición y llamada del constructor es un poco compleja, pero se ejemplifica claramente. Por cierto, el constructor de la clase hija podría tener más argumentos y pasarle únicamente algunos a la del padre.

Como siempre, recuerda que la clase puede definir sus propios métodos y propiedades, así como extender de varias clases.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Resetear GOOJPRT PT-210 MTP-II (Impresora térmica)

El día de hoy vamos a ver cómo restablecer la impresora térmica GOOJPRT PT-210 a…

4 semanas hace

Proxy Android para impresora térmica ESC POS

Hoy voy a enseñarte cómo imprimir en una impresora térmica conectada por USB a una…

4 semanas hace

Android – Servidor web con servicio en segundo plano

En este post voy a enseñarte a programar un servidor web en Android asegurándonos de…

4 semanas hace

Cancelar trabajo de impresión con C++

En este post te quiero compartir un código de C++ para listar y cancelar trabajos…

2 meses hace

Copiar bytes de Golang a JavaScript con WebAssembly

Gracias a WebAssembly podemos ejecutar código de otros lenguajes de programación desde el navegador web…

3 meses hace

Imprimir PDF con Ghostscript en Windows de manera programada

Revisando y buscando maneras de imprimir un PDF desde la línea de comandos me encontré…

3 meses hace