Constructores heredados en C++

Muhammad Husnain 12 octubre 2023
  1. Herencia en C++
  2. Implementación de Herencia en C++
  3. Herencia de constructores en C++
Constructores heredados en C++

Este artículo trata sobre el concepto de herencia en C++ y cómo podemos heredar los constructores de la clase base en la clase derivada.

Herencia en C++

En C++, particularmente en la programación orientada a objetos, el concepto más fundamental y ampliamente utilizado es el de herencia. Es una característica en la que podemos definir una clase como una clase secundaria de otra.

Esto también nos permite reutilizar algunas funcionalidades del código y reduce nuestro tiempo de implementación. Nos permite derivar las funcionalidades y propiedades de la clase base a la clase derivada.

  1. Clase base: la clase cuyas propiedades y funcionalidades utiliza otra clase se denomina clase base. A veces también se le conoce como superclase.
  2. Clase derivada: la clase que toma las propiedades y funcionalidades de otra clase se denomina clase derivada. A veces también se denomina subclase.

Considere un ejemplo de algunos vehículos. Automóvil, Autobús y Camión son todos automóviles, y todos estos automóviles tienen algunas características comunes, y algunas son diferentes.

Como todos estos son automóviles y todos los automóviles tienen algunas funcionalidades que son uniformes entre todos. Si creamos clases para todos estos automóviles, estaremos duplicando mucho el código.

Esto se ilustra en la siguiente figura.

Herencia

Puede ver en la imagen de arriba que todos los automóviles tienen las mismas funcionalidades. Esto creará la duplicación del código tres veces.

La duplicación de código genera muchos otros problemas, como posibilidades de errores, mayor tiempo de procesamiento, etc. La herencia se utiliza para superar tales situaciones.

Podemos crear una clase Automóvil que consta de todas estas funcionalidades y derivar las clases restantes con esta clase. Con esto, podemos disminuir la duplicación de código y aumentar la reutilización del código.

Solución de herencia

Puede ver en la imagen de arriba que hemos reducido el código duplicado y todas las funcionalidades están incluidas en todas las clases. La herencia suele definir una relación es-un.

Por ejemplo, un coche es-un automóvil, un círculo es-una forma, un perro es-un animal, etc.

Implementación de Herencia en C++

Necesitamos seguir la siguiente sintaxis para derivar una subclase de una clase base.

class derived - class - name : access - specifier base - class - name { .. }

Este especificador de acceso está ahí para decidir cómo necesitamos heredar las funcionalidades de la clase base. Si los necesitamos todos o algunos de ellos se decide en función del especificador de acceso.

Puede ser public, private o protected. Si no especificamos el especificador de acceso, por defecto es private.

Ejemplo:

public
class Automobile {
 public:
  getFuelAmount();
  applyBrakes();
  startEngine();
  stopEngine();
} public class Car : public Automobile {
  pressHorn();
} public class Bus : public Automobile {
  pressHorn();
}

Puede ver en el código anterior que las dos clases derivadas tienen solo una función que no es uniforme para ambas, ya que el sonido de la bocina es diferente para todos los vehículos. Por tanto, hemos hecho esa función en la clase derivada, y el resto están en la clase base.

Considere otro ejemplo de la clase Shapes.

#include <iostream>
#include <string>
using namespace std;
class Shapes {
 public:
  int w;
  int h;
};
class Square : public Shapes {
 public:
  int getArea() { return w * h; }
};
int main() {
  Square s;
  s.w = 5;
  s.h = 5;
  cout << "Area: " << s.getArea() << endl;
  return 0;
}

Producción :

Area: 25

Herencia de constructores en C++

Podemos ver en el ejemplo anterior que las funciones y propiedades se heredan en la clase derivada como lo son de la clase base. Pero si necesitamos llamar al constructor de la clase base, entonces debemos llamarlo explícitamente en el constructor de la clase derivada.

Los constructores no se llaman automáticamente. Considere un ejemplo a continuación.

#include <iostream>
using namespace std;
class baseClass {
 public:
  baseClass() { cout << "In constructor: Base" << endl; }
};
class derivedClass : public baseClass {
 public:
  derivedClass() : baseClass() { cout << "In Constructor: derived" << endl; }
};
int main() {
  derivedClass d;
  cout << "In main" << endl;
}

Producción :

In constructor: Base
In Constructor: derived
In main

En C++ 11, esto se puede hacer usando using-declaration. Con using-declaration, podemos usar una función de clase derivada en la clase base.

El ejemplo anterior se puede modificar de la siguiente manera.

#include <iostream>
using namespace std;
class baseClass {
 public:
  baseClass() { cout << "In constructor: Base" << endl; }
};
class derivedClass : public baseClass {
  using baseClass::baseClass;

 public:
  derivedClass() { cout << "In Constructor: derived" << endl; }
};
int main() {
  derivedClass d;
  cout << "In main" << endl;
}

También producirá la misma salida.

In constructor: Base
In Constructor: derived
In main
Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn

Artículo relacionado - C++ Inheritance