Dado que la clase derivada contiene la clase base, cuando creamos una clase derivada, el sistema primero creará una clase base. Cabe señalar que la clase derivada absorberá todos los miembros de la clase base, pero no incluye el constructor ni el destructor mencionados más adelante. Esto significa que al crear una clase derivada, primero llamará a la clase base antes de llamar a su propio constructor. Constructora .
Aquí podemos verificar esto a través del código:
#include<iostream>usingnamespacestd;classClock{privado:intH;intM;intS;public:Clock(){cout<<¡Constructor del reloj llamado!<<endl;}};classAlarmClock:publicClock{privado:intAH;intAM;public:AlarmClock (){cout<<Constructor de AlarmClockllamado!<<endl;}};intmain(){AlarmClockA;return0;}
La captura de pantalla en ejecución es la siguiente:
Podemos ver que solo se define un objeto de clase derivada, y los constructores de la clase derivada y la clase base se llamarán automáticamente. El orden de llamada es llamar primero al constructor de la clase base y luego al constructor de la clase derivada .
Lo que has visto arriba es el método de llamada más común y simple. Esto es solo implícito, es decir, se llama automáticamente sin escribirlo. Entonces, ¿cómo llamarlo cuando el constructor de la clase base toma parámetros? ¿Está bien? ¿Cómo pasar parámetros?
Respuesta: Entonces debemos decírselo explícitamente al compilador, es decir, escribirlo claramente y especificar los parámetros a pasar.
El formato general de escritura es:
Nombre del constructor de clase derivada (columna de la lista de parámetros totales): Constructor de clase base (columna de la lista de parámetros reales)
Por ejemplo código:
#include<iostream>usingnamespacestd;classClock{privado:intH;intM;intS;public:Clock(){cout<<¡Se llama al constructor del reloj!<<endl;}Reloj(inth,intm,ints){this->H=h ;this->M=m;this->S=s;cout<<Constructor del reloj con parámetro llamado!<<endl;}};classAlarmClock:publicClock{privado:intAH;intAM;public:AlarmClock(){cout<<AlarmClock' sConstructorCalled!<<endl;}AlarmClock(inth,intm,ints):Clock(h,m,s){cout<<AlarmClock'sConstructorwithparameterCalled!<<endl;}};intmain(){AlarmClockA(8,10,30 );AlarmaB;return0;}
Preste atención al constructor de la clase derivada. Más adelante, se pasan los dos puntos y los parámetros de la clase base, y los parámetros en la clase base son parámetros reales para realizar la llamada explícita al parámetro. ¡Por favor practica en tu computadora!
Cabe señalar que una vez que hay un constructor con parámetros en la clase base, debe haber un constructor de clase derivada con parámetros explícitos que pasan a la clase derivada para realizar la transferencia de parámetros en la clase base y completar el trabajo de inicialización.