Поскольку производный класс содержит базовый класс, при создании производного класса система сначала создает базовый класс. Следует отметить, что производный класс поглотит все члены базового класса, но не будет включать упомянутые ниже конструктор и деструктор. Это означает, что при создании производного класса он сначала вызывает базовый класс, а затем вызывает свой собственный конструктор. Конструктор .
Здесь мы можем проверить это с помощью кода:
#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;}
Рабочий скриншот выглядит следующим образом:
Мы видим, что определен только один объект производного класса, и конструкторы производного класса и базового класса будут вызываться автоматически. Порядок вызова заключается в том, чтобы сначала вызвать конструктор базового класса , а затем конструктор производного класса .
То, что вы видели выше, является наиболее распространенным и простым методом вызова. Это только неявный метод, то есть он вызывается автоматически без его записи. Так как же его вызвать, когда конструктор базового класса принимает параметры? Это нормально? Как передать параметры?
Ответ: Тогда нам нужно сообщить компилятору явно, то есть четко прописать это и указать передаваемые параметры.
Общий формат записи:
Имя конструктора производного класса (столбец общего списка параметров): Конструктор базового класса (столбец фактического списка параметров)
Например код:
#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;}
Обратите внимание на конструктор производного класса. Позже передаются двоеточие и параметры базового класса, а параметры базового класса являются фактическими параметрами для реализации явного вызова параметров. Пожалуйста, тренируйтесь на своем компьютере!
Следует отметить, что раз есть конструктор с параметрами в базовом классе, то должен быть и конструктор производного класса с явной передачей параметров в производном классе, чтобы реализовать передачу параметров в базовом классе и завершить работу по инициализации.