Apakah Polimorfisme dalam C ++?
Dalam C ++, polimorfisme menyebabkan fungsi anggota berperilaku berbeza berdasarkan objek yang memanggil / memintanya. Polimorfisme adalah perkataan Yunani yang bermaksud mempunyai banyak bentuk. Ia berlaku apabila anda mempunyai hierarki kelas yang berkaitan melalui pewarisan.
Sebagai contoh, anggaplah kita mempunyai fungsi makeSound (). Apabila kucing memanggil fungsi ini, ia akan menghasilkan bunyi meow. Apabila seekor lembu menggunakan fungsi yang sama, ia akan memberikan suara moow.
Walaupun kita memiliki satu fungsi, ia berperilaku berbeda dalam keadaan yang berbeda. Fungsi ini mempunyai banyak bentuk; oleh itu, kita telah mencapai polimorfisme.
Dalam tutorial C ++ ini, anda akan belajar:
- Apa itu Polimorfisme?
- Jenis-jenis Polimorfisme
- Menyusun Polimorfisme Masa
- Beban Berfungsi
- Beban Pengendali
- Polimorfisme Masa Jalan
- Fungsi Menimpa
- Fungsi Maya C ++
- Polimorfisme Masa Kompilasi Vs. Polimorfisme Masa Berlari
Jenis-jenis Polimorfisme
C ++ menyokong dua jenis polimorfisme:
- Polimorfisme masa kompilasi, dan
- Polimorfisme jangka masa.
Menyusun Polimorfisme Masa
Anda menggunakan fungsi yang berlebihan dengan memadankan bilangan dan jenis argumen. Maklumat ada semasa waktu kompilasi. Ini bermaksud penyusun C ++ akan memilih fungsi yang betul pada waktu kompilasi.
Polimorfisme masa kompilasi dicapai melalui fungsi berlebihan dan beban operator.
Beban Berfungsi
Kelebihan fungsi berlaku apabila kita mempunyai banyak fungsi dengan nama yang serupa tetapi berbeza argumen. Argumen mungkin berbeza dari segi bilangan atau jenis.
Contoh 1:
#includeusing namespace std;void test(int i) {cout << " The int is " << i << endl;}void test(double f) {cout << " The float is " << f << endl;}void test(char const *ch) {cout << " The char* is " << ch << endl;}int main() {test(5);test(5.5);test("five");return 0;}
Pengeluaran:
Berikut adalah tangkapan skrin kod:
Penjelasan Kod:
- Sertakan fail tajuk iostream ke dalam kod kami. Kami akan dapat menggunakan fungsinya.
- Sertakan ruang nama std dalam kod kami. Kami akan dapat menggunakan kelasnya tanpa menyebutnya.
- Buat fungsi bernama ujian yang mengambil parameter integer i. {Menandakan permulaan ujian fungsi badan.
- Pernyataan yang akan dilaksanakan sekiranya ujian fungsi di atas dipanggil / dipanggil.
- Bahagian akhir ujian fungsi di atas.
- Buat fungsi bernama ujian yang mengambil parameter float f. {Menandakan permulaan ujian fungsi badan.
- Pernyataan yang akan dilaksanakan sekiranya ujian fungsi di atas dipanggil / dipanggil.
- Akhir badan ujian fungsi di atas.
- Buat fungsi bernama ujian yang mengambil parameter watak ch. {Menandakan permulaan ujian fungsi badan.
- Pernyataan yang akan dilaksanakan sekiranya ujian fungsi di atas dipanggil / dipanggil.
- Akhir badan ujian fungsi di atas.
- Panggil fungsi utama (). {Menandakan permulaan badan fungsi.
- Panggil ujian fungsi dan lulus 5 kepadanya sebagai nilai argumen. Ini memanggil fungsi ujian yang menerima argumen integer, iaitu fungsi ujian pertama.
- Panggil ujian fungsi dan lulus 5.5 kepadanya sebagai nilai argumen. Ini akan memanggil fungsi ujian yang menerima argumen apungan, iaitu fungsi ujian kedua.
- Panggil ujian fungsi dan lulus lima sebagai nilai argumen. Ini akan memanggil fungsi ujian yang menerima argumen watak, iaitu fungsi ujian ketiga.
- Program mesti mengembalikan nilai jika berjaya.
- Bahagian akhir fungsi utama ().
Kami mempunyai tiga fungsi dengan nama yang sama tetapi pelbagai jenis argumen. Kami telah mencapai polimorfisme.
Beban Pengendali
Dalam Operator Overloading, kami menentukan makna baru untuk pengendali C ++. Ia juga mengubah cara pengendali berfungsi. Sebagai contoh, kita dapat menentukan operator + untuk menggabungkan dua rentetan. Kami mengetahuinya sebagai operator penambahan untuk menambah nilai berangka. Selepas definisi kami, apabila diletakkan di antara bilangan bulat, ia akan menambahkannya. Apabila diletakkan di antara tali, ia akan menggabungkannya.
Contoh 2:
#includeusing namespace std;class ComplexNum {private:int real, over;public:ComplexNum(int rl = 0, int ov = 0) {real = rl;over = ov;}ComplexNum operator + (ComplexNum const &obj) {ComplexNum result;result.real = real + obj.real;result.over = over + obj.over;return result;}void print() {cout << real << " + i" << over << endl;}};int main(){ComplexNum c1(10, 2), c2(3, 7);ComplexNum c3 = c1+c2;c3.print();}
Pengeluaran:
Berikut adalah tangkapan skrin kod:
Penjelasan Kod:
- Sertakan fail header iostream ke dalam program kami untuk menggunakan fungsinya.
- Sertakan ruang nama std ke dalam program kami untuk menggunakan kelasnya tanpa memanggilnya.
- Buat kelas bernama ComplexNum. {Menandakan permulaan badan kelas.
- Gunakan pengubah akses peribadi untuk menandakan pemboleh ubah sebagai peribadi, yang bermaksud ia hanya dapat diakses dari dalam kelas.
- Tentukan dua pemboleh ubah integer, nyata dan lebih.
- Gunakan pengubah akses awam untuk menandakan konstruktor sebagai umum, yang bermaksud bahawa ia dapat diakses walaupun dari luar kelas.
- Buat pembina kelas dan memulakan pemboleh ubah.
- Memulakan nilai pemboleh ubah nyata.
- Permulaan nilai pemboleh ubah lebih.
- Hujung badan pembina.
- Kita perlu mengatasi maksud pengendali +.
- Buat hasil jenis data dari jenis ComplexNum.
- Gunakan operator + dengan nombor kompleks. Garis ini akan menambahkan bahagian nyata nombor ke bahagian nyata nombor lain.
- Gunakan operator + dengan nombor kompleks. Garis ini akan menambahkan bahagian khayalan nombor ke bahagian khayalan nombor lain.
- Program ini akan mengembalikan nilai hasil berubah apabila berjaya dilaksanakan.
- Akhir definisi makna baru operator +, iaitu kelebihan beban.
- Panggil kaedah cetak ().
- Cetak nombor kompleks baru selepas penambahan pada konsol.
- Fungsi bahagian akhir cetakan ().
- Akhir badan kelas ComplexNum.
- Panggil fungsi utama ().
- Lulus nilai kedua-dua bahagian nyata dan kompleks yang akan ditambah. Bahagian pertama c1 akan ditambahkan ke bahagian pertama c2, iaitu 10 + 3. Bahagian kedua c1 akan ditambahkan ke bahagian kedua c, iaitu 2 + 7.
- Lakukan operasi menggunakan operator + yang berlebihan dan simpan hasilnya dalam pemboleh ubah c3.
- Cetak nilai pemboleh ubah c3 pada konsol.
- Akhir fungsi utama () fungsi.
Polimorfisme Masa Jalan
Ini berlaku apabila kaedah objek dipanggil / dipanggil semasa runtime dan bukan pada waktu kompilasi. Polimorfisme jangka masa dicapai melalui penggantian fungsi. Fungsi yang akan dipanggil / dipanggil dipanggil semasa menjalankan.
Fungsi Menimpa
Pengalihan fungsi berlaku apabila fungsi kelas asas diberi definisi baru dalam kelas turunan. Pada masa itu, kita dapat mengatakan fungsi asas telah diganti.
Sebagai contoh:
#includeusing namespace std;class Mammal {public:void eat() {cout << "Mammals eat… ";}};class Cow: public Mammal {public:void eat() {cout << "Cows eat grass… ";}};int main(void) {Cow c = Cow();c.eat();return 0;}
Pengeluaran:
Berikut adalah tangkapan skrin kod:
Penjelasan Kod:
- Import fail header iostream ke dalam program kami untuk menggunakan fungsinya.
- Sertakan ruang nama std ke dalam program kami untuk menggunakan kelasnya tanpa memanggilnya.
- Buat kelas bernama Mammal. {Menandakan permulaan badan kelas.
- Gunakan pengubah akses awam untuk menetapkan fungsi yang akan kita buat sebagai mudah diakses oleh umum. Ia boleh diakses dari luar kelas ini.
- Buat fungsi awam bernama makan. {Menandakan permulaan badan fungsi.
- Cetak pernyataan yang ditambahkan ke fungsi cout ketika fungsi makan () dipanggil.
- Bahagian akhir fungsi makan ().
- Hujung badan mamalia kelas.
- Buat kelas bernama Cow yang mewarisi kelas Mamalia. Lembu adalah kelas turunan, sementara Mamalia adalah kelas asas. {Menandakan permulaan kelas ini.
- Gunakan pengubah akses awam untuk menandakan fungsi yang akan kita buat sebagai boleh diakses oleh umum. Ia boleh diakses dari luar kelas ini.
- Ganti fungsi makan () yang ditentukan dalam kelas asas. {Menandakan permulaan badan fungsi.
- Pernyataan untuk dicetak pada konsol apabila fungsi ini dipanggil.
- Bahagian akhir fungsi makan ().
- Hujung badan lembu kelas.
- Panggil fungsi utama (). {Menandakan permulaan badan fungsi ini.
- Buat contoh kelas Lembu dan beri nama c.
- Panggil fungsi makan () yang ditentukan dalam kelas Lembu.
- Program mesti mengembalikan nilai setelah berjaya diselesaikan.
- Akhir fungsi utama ().
Fungsi Maya C ++
Fungsi maya adalah cara lain untuk melaksanakan polimorfisme jangka masa dalam C ++. Ini adalah fungsi khas yang ditentukan dalam kelas asas dan ditakrifkan semula pada kelas turunan. Untuk menyatakan fungsi maya, anda harus menggunakan kata kunci maya. Kata kunci harus mendahului pengisytiharan fungsi di kelas asas.
Sekiranya kelas fungsi maya diwarisi, kelas maya mentakrifkan semula fungsi maya agar sesuai dengan keperluannya. Sebagai contoh:
#includeusing namespace std;class ClassA {public:virtual void show() {cout << "The show() function in base class invoked… " << endl;}};class ClassB :public ClassA {public:void show() {cout << "The show() function in derived class invoked… ";}};int main() {ClassA* a;ClassB b;a = &b;a->show();}
Pengeluaran:
Berikut adalah tangkapan skrin kod:
Penjelasan Kod:
- Sertakan fail header iostream dalam kod untuk menggunakan fungsinya.
- Sertakan ruang nama std dalam kod kami untuk menggunakan kelasnya tanpa memanggilnya.
- Buat kelas bernama ClassA.
- Gunakan pengubah akses awam untuk menandakan ahli kelas sebagai boleh diakses secara terbuka.
- Buat fungsi maya bernama show (). Ia akan menjadi fungsi umum.
- Teks yang akan dicetak semasa pertunjukan () dipanggil dipanggil. Endl adalah kata kunci C ++, yang bermaksud garis akhir. Ia menggerakkan kursor tetikus ke baris seterusnya.
- Akhir badan pertunjukan fungsi maya ().
- Akhir badan kelas ClassA.
- Membuat kelas baru bernama ClassB yang mewarisi kelas ClassA. ClassA menjadi kelas asas manakala ClassB menjadi kelas turunan.
- Gunakan pengubah akses awam untuk menandakan ahli kelas sebagai boleh diakses secara terbuka.
- Tentukan semula rancangan fungsi maya () yang berasal dari kelas asas.
- Teks yang akan dicetak pada konsol apabila fungsi show () yang ditentukan dalam kelas turutan dipanggil.
- Fungsi bahagian akhir persembahan ().
- Akhir badan kelas turutan, ClassB.
- Panggil fungsi utama (). Logik program harus ditambahkan dalam badannya.
- Buat pemboleh ubah penunjuk yang bernama a. Ia menunjukkan kelas bernama ClassA.
- Buat contoh kelas bernama ClassB. Contohnya diberi nama b.
- Tugaskan nilai nilai di alamat b dalam pemboleh ubah a.
- Memanggil fungsi tunjuk () yang ditentukan dalam kelas turunan. Pengikatan lewat telah dilaksanakan.
- Akhir badan utama () fungsi.
Polimorfisme Masa Kompilasi Vs. Polimorfisme Masa Berlari
Berikut adalah perbezaan utama antara keduanya:
Polimorfisme masa kompilasi | Polimorfisme jangka masa |
Ia juga disebut polimorfisme pengikat awal atau statik | Ia juga dipanggil pengikatan lewat / dinamik atau polimorfisme dinamik |
Kaedah dipanggil / dipanggil semasa waktu kompilasi | Kaedah dipanggil / dipanggil semasa masa berjalan |
Dilaksanakan melalui fungsi overloading dan operator overloading | Dilaksanakan melalui kaedah overriding dan fungsi maya |
Contohnya, kaedah overloading. Banyak kaedah mungkin mempunyai nama yang serupa tetapi berbeza atau jenis argumen | Contohnya, kaedah mengatasi. Banyak kaedah mungkin mempunyai nama yang serupa dan prototaip yang sama. |
Pelaksanaan lebih cepat kerana penemuan kaedah dilakukan pada waktu kompilasi | Pelaksanaan yang lebih perlahan kerana penemu kaedah dilakukan semasa waktu berjalan. |
Kurang fleksibiliti untuk menyelesaikan masalah diberikan kerana semuanya diketahui semasa waktu penyusunan. | Banyak fleksibiliti yang diberikan untuk menyelesaikan masalah yang rumit kerana kaedah ditemui semasa menjalankan. |
Ringkasan:
- Polimorfisme bermaksud mempunyai banyak bentuk.
- Ia berlaku apabila terdapat hierarki kelas yang berkaitan melalui pewarisan.
- Dengan polimorfisme, fungsi dapat berperilaku berbeza berdasarkan objek yang memanggil / memanggilnya.
- Dalam polimorfisme masa kompilasi, fungsi yang akan digunakan dibuat semasa waktu kompilasi.
- Dalam polimorfisme runtime, fungsi yang akan digunakan dibuat semasa runtime.
- Polimorfisme masa kompilasi ditentukan melalui fungsi berlebihan dan beban operator.
- Dalam fungsi yang berlebihan, terdapat banyak fungsi dengan nama yang serupa tetapi argumen yang berbeza.
- Parameter boleh berbeza dalam jumlah atau jenis.
- Dalam pembebanan operator, makna baru ditakrifkan untuk pengendali C ++.
- Polimorfisme jangka masa dicapai melalui penggantian fungsi.
- Dalam penggantian fungsi, kelas turunan memberikan definisi baru untuk fungsi yang ditentukan dalam kelas asas.