Saltar al contenido

¿Cuáles son las reglas para llamar al constructor de la superclase?

Ten en cuenta que en las ciencias cualquier problema casi siempre tiene más de una soluciones, pero mostramos lo más óptimo y eficiente.

Solución:

Los constructores de la clase base se llaman automáticamente si no tienen ningún argumento. Si desea llamar a un constructor de superclase con un argumento, debe usar la lista de inicialización del constructor de la subclase. A diferencia de Java, C++ admite la herencia múltiple (para bien o para mal), por lo que se debe hacer referencia a la clase base por su nombre, en lugar de “super()”.

class SuperClass

    public:

        SuperClass(int foo)
        
            // do something with foo
        
;

class SubClass : public SuperClass

    public:

        SubClass(int foo, int bar)
        : SuperClass(foo)    // Call the superclass constructor in the subclass' initialization list.
        
            // do something with bar
        
;

Más información sobre la lista de inicialización del constructor aquí y aquí.

En C++, los constructores sin argumentos para todas las superclases y variables miembro se llaman por usted, antes de ingresar su constructor. Si desea pasarles argumentos, hay una sintaxis separada para esto llamada “encadenamiento de constructores”, que se ve así:

class Sub : public Base

  Sub(int x, int y)
  : Base(x), member(y)
  
  
  Type member;
;

Si algo ejecutado en este punto arroja, las bases/miembros que habían completado previamente la construcción tienen sus destructores llamados y la excepción se vuelve a lanzar a la persona que llamó. Si desea detectar excepciones durante el encadenamiento, debe usar un bloque de prueba de función:

class Sub : public Base

  Sub(int x, int y)
  try : Base(x), member(y)
  
    // function body goes here
   catch(const ExceptionType &e) 
    throw kaboom();
  
  Type member;
;

En este formulario, tenga en cuenta que el bloque try es el cuerpo de la función, en lugar de estar dentro del cuerpo de la función; esto le permite detectar excepciones lanzadas por miembros implícitos o explícitos e inicializaciones de clase base, así como durante el cuerpo de la función. Sin embargo, si un bloque catch de función no arroja una excepción diferente, el tiempo de ejecución volverá a generar el error original; excepciones durante la inicialización no poder ser ignorado.

En C++ hay un concepto de lista de inicialización del constructor, que es donde puede y debe llamar al constructor de la clase base y donde también debe inicializar los miembros de datos. La lista de inicialización viene después de la firma del constructor después de dos puntos y antes del cuerpo del constructor. Digamos que tenemos una clase A:


class A : public B

public:
  A(int a, int b, int c);
private:
  int b_, c_;
;

Entonces, asumiendo que B tiene un constructor que toma un int, el constructor de A puede verse así:


A::A(int a, int b, int c) 
  : B(a), b_(b), c_(c) // initialization list

  // do something

Como puede ver, el constructor de la clase base se llama en la lista de inicialización. Por cierto, es preferible inicializar los miembros de datos en la lista de inicialización que asignar los valores para b_ y c_ dentro del cuerpo del constructor, porque se está ahorrando el costo adicional de la asignación.

Tenga en cuenta que los miembros de datos siempre se inicializan en el orden en que se declaran en la definición de clase, independientemente de su orden en la lista de inicialización. Para evitar errores extraños, que pueden surgir si sus miembros de datos dependen unos de otros, siempre debe asegurarse de que el orden de los miembros sea el mismo en la lista de inicialización y en la definición de clase. Por la misma razón, el constructor de la clase base debe ser el primer elemento de la lista de inicialización. Si lo omite por completo, se llamará automáticamente al constructor predeterminado para la clase base. En ese caso, si la clase base no tiene un constructor predeterminado, obtendrá un error de compilación.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *