Karena kelas turunan berisi kelas dasar, maka ketika kita membuat kelas turunan, sistem akan membuat kelas dasar terlebih dahulu. Perlu dicatat bahwa kelas turunan akan menyerap semua anggota kelas dasar, tetapi tidak termasuk konstruktor dan destruktor yang disebutkan nanti. Artinya, ketika membuat kelas turunan, kelas dasar akan dipanggil terlebih dahulu sebelum memanggil konstruktornya sendiri .
Di sini kita dapat memverifikasi ini melalui kode:
#include<iostream>usingnamespacestd;classClock{private:intH;intM;intS;public:Clock(){cout<<Clock'sConstructorCalled!<<endl;}};classAlarmClock:publicClock{private:intAH;intAM;public:AlarmClock (){cout<<KonstruktorJamAlarmCalled!<<endl;}};intmain(){AlarmClockA;return0;}
Tangkapan layar yang berjalan adalah sebagai berikut:
Kita dapat melihat bahwa hanya satu objek kelas turunan yang didefinisikan, dan konstruktor dari kelas turunan dan kelas dasar akan dipanggil secara otomatis. Urutan pemanggilannya adalah memanggil konstruktor kelas dasar terlebih dahulu dan kemudian konstruktor kelas turunan .
Apa yang Anda lihat di atas adalah metode pemanggilan yang paling umum dan paling sederhana. Ini hanya implisit, yaitu dipanggil secara otomatis tanpa menuliskannya. Jadi bagaimana cara menyebutnya ketika konstruktor kelas dasar mengambil parameter? Apakah ini baik-baik saja? Bagaimana cara melewatkan parameter?
Jawaban: Kemudian kita perlu memberi tahu kompiler secara eksplisit, yaitu menuliskannya dengan jelas dan menentukan parameter yang akan diteruskan.
Format penulisan umumnya adalah:
Nama konstruktor kelas turunan (kolom daftar parameter total): Konstruktor kelas dasar (kolom daftar parameter aktual)
Misalnya kode:
#include<iostream>usingnamespacestd;classClock{private:intH;intM;intS;public:Clock(){cout<<Clock'sConstructorCalled!<<endl;}Jam(inth,intm,ints){this->H=h ;ini->M=m;ini->S=s;cout<<Konstruktor Jam denganparameterDipanggil!<<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 );Jam AlarmB;kembali0;}
Harap perhatikan konstruktor kelas turunan. Nanti, titik dua dan parameter kelas dasar diteruskan, dan parameter di kelas dasar adalah parameter aktual untuk mewujudkan pemanggilan parameter eksplisit. Silakan berlatih di komputer Anda!
Perlu dicatat bahwa begitu ada konstruktor dengan parameter di kelas dasar, harus ada konstruktor kelas turunan dengan parameter eksplisit yang meneruskan kelas turunan untuk mewujudkan transfer parameter di kelas dasar dan menyelesaikan pekerjaan inisialisasi.