Da die abgeleitete Klasse die Basisklasse enthält, erstellt das System beim Erstellen einer abgeleiteten Klasse zunächst eine Basisklasse. Es ist zu beachten, dass die abgeleitete Klasse alle Mitglieder der Basisklasse aufnimmt, jedoch nicht den später erwähnten Konstruktor und Destruktor enthält. Dies bedeutet, dass beim Erstellen einer abgeleiteten Klasse zunächst die Basisklasse aufgerufen wird, bevor der eigene Konstruktor aufgerufen wird . Konstrukteur .
Hier können wir dies durch Code überprüfen:
#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;}
Der laufende Screenshot sieht wie folgt aus:
Wir können sehen, dass nur ein abgeleitetes Klassenobjekt definiert ist und die Konstruktoren der abgeleiteten Klasse und der Basisklasse automatisch aufgerufen werden. Die Aufrufreihenfolge besteht darin, zuerst den Konstruktor der Basisklasse und dann den Konstruktor der abgeleiteten Klasse aufzurufen.
Was Sie oben gesehen haben, ist die häufigste und einfachste Aufrufmethode. Dies ist nur implizit, das heißt, sie wird automatisch aufgerufen, ohne sie aufzuschreiben. Wie kann man es also aufrufen, wenn der Konstruktor der Basisklasse Parameter akzeptiert? Ist das in Ordnung? Wie übergebe ich Parameter?
Antwort: Dann müssen wir es dem Compiler explizit mitteilen, das heißt, es klar aufschreiben und die zu übergebenden Parameter angeben.
Das allgemeine Schreibformat ist:
Name des abgeleiteten Klassenkonstruktors (Spalte der Gesamtparameterliste): Basisklassenkonstruktor (Spalte der tatsächlichen Parameterliste)
Beispielcode:
#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;}
Bitte achten Sie auf den Konstruktor der abgeleiteten Klasse. Anschließend werden der Doppelpunkt und die Parameter der Basisklasse übergeben, und die Parameter in der Basisklasse sind tatsächliche Parameter, um den expliziten Parameteraufruf zu realisieren. Bitte üben Sie am Computer!
Es ist zu beachten, dass, sobald in der Basisklasse ein Konstruktor mit Parametern vorhanden ist, in der abgeleiteten Klasse ein abgeleiteter Klassenkonstruktor mit expliziter Parameterübergabe vorhanden sein muss, um die Parameterübertragung in der Basisklasse zu realisieren und die Initialisierungsarbeit abzuschließen.