Étant donné que la classe dérivée contient la classe de base, lorsque nous créons une classe dérivée, le système crée d'abord une classe de base. Il convient de noter que la classe dérivée absorbera tous les membres de la classe de base, mais n'inclut pas le constructeur et le destructeur mentionnés plus loin. Cela signifie que lors de la création d'une classe dérivée, elle appellera d'abord la classe de base avant d'appeler son propre constructeur. . Constructeur .
Ici, nous pouvons le vérifier via le code :
#include<iostream>usingnamespacestd;classClock{private:intH;intM;intS;public:Clock(){cout<<Clock'sConstructorCalled!<<endl;}};classAlarmClock:publicClock{private:intAH;intAM;public:AlarmClock (){cout<<AlarmClock'sConstructorCalled!<<endl;}};intmain(){AlarmClockA;return0;}
La capture d'écran en cours d'exécution est la suivante :
Nous pouvons voir qu'un seul objet de classe dérivée est défini, et les constructeurs de la classe dérivée et de la classe de base seront appelés automatiquement. L'ordre d'appel est d'appeler d'abord le constructeur de la classe de base , puis le constructeur de la classe dérivée .
Ce que vous avez vu ci-dessus est la méthode d'appel la plus courante et la plus simple. Elle est uniquement implicite, c'est-à-dire qu'elle est appelée automatiquement sans l'écrire. Alors comment l’appeler lorsque le constructeur de la classe de base prend des paramètres ? Est-ce que ça va ? Comment passer des paramètres ?
Réponse : Ensuite, nous devons l'indiquer explicitement au compilateur, c'est-à-dire l'écrire clairement et spécifier les paramètres à transmettre.
Le format général d'écriture est le suivant :
Nom du constructeur de classe dérivé (colonne de la liste totale des paramètres) : Constructeur de classe de base (colonne de la liste des paramètres réels)
Par exemple le code :
#include<iostream>usingnamespacestd;classClock{private:intH;intM;intS;public:Clock(){cout<<Clock'sConstructorCalled!<<endl;}Clock(inth,intm,ints){this->H=h ;this->M=m;this->S=s;cout<<Clock'sConstructorwithparameterCalled!<<endl;}};classAlarmClock:publicClock{private: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 );AlarmClockB;return0;}
Veuillez faire attention au constructeur de la classe dérivée. Plus tard, les deux points et les paramètres de la classe de base sont passés, et les paramètres de la classe de base sont des paramètres réels pour réaliser l'appel explicite du paramètre. S'il vous plaît, entraînez-vous sur votre ordinateur !
Il convient de noter qu'une fois qu'il existe un constructeur avec des paramètres dans la classe de base, il doit y avoir un constructeur de classe dérivée avec un passage de paramètres explicite dans la classe dérivée pour réaliser le transfert des paramètres dans la classe de base et terminer le travail d'initialisation.