Como a classe derivada contém a classe base, quando criamos uma classe derivada, o sistema primeiro criará uma classe base. Deve-se notar que a classe derivada absorverá todos os membros da classe base, mas não incluirá o construtor e o destruidor mencionados posteriormente. Isso significa que ao criar uma classe derivada, ela primeiro chamará a classe base antes de chamar seu próprio construtor. Construtor .
Aqui podemos verificar isso através do código:
#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;}
A captura de tela em execução é a seguinte:
Podemos ver que apenas um objeto de classe derivada é definido, e os construtores da classe derivada e da classe base serão chamados automaticamente. A ordem de chamada é chamar primeiro o construtor da classe base e depois o construtor da classe derivada .
O que você viu acima é o método de chamada mais comum e simples. Isso é apenas implícito, ou seja, é chamado automaticamente sem ser escrito. Então, como chamá-lo quando o construtor da classe base recebe parâmetros? Está tudo bem? Como passar parâmetros?
Resposta: Então precisamos informar explicitamente ao compilador, ou seja, escrevê-lo claramente e especificar os parâmetros a serem passados.
O formato geral de escrita é:
Nome do construtor da classe derivada (coluna da lista de parâmetros total): Construtor da classe base (coluna da lista de parâmetros real)
Por exemplo código:
#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;}
Preste atenção ao construtor da classe derivada. Posteriormente, os dois pontos e os parâmetros da classe base são passados, e os parâmetros da classe base são parâmetros reais para realizar a chamada explícita do parâmetro. Pratique no seu computador!
Deve-se notar que uma vez que existe um construtor com parâmetros na classe base, deve haver um construtor de classe derivada com passagem explícita de parâmetros na classe derivada para realizar a transferência de parâmetros na classe base e concluir o trabalho de inicialização.