C++ Polimorfisme dengan Contoh
Apa yang dimaksud dengan Polimorfisme C++?
In C++, polimorfisme menyebabkan fungsi anggota berperilaku berbeda berdasarkan objek yang memanggil/memanggilnya. Polimorfisme berasal dari bahasa Yunani yang artinya mempunyai banyak bentuk. Ini terjadi ketika Anda memiliki hierarki kelas yang terkait melalui warisan.
Misalnya, kita mempunyai fungsi makeSound(). Saat kucing memanggil fungsi ini, ia akan mengeluarkan suara mengeong. Saat seekor sapi menjalankan fungsi yang sama, ia akan mengeluarkan suara moow.
Meskipun kita mempunyai satu fungsi, fungsinya berbeda dalam keadaan yang berbeda. Fungsinya mempunyai banyak bentuk; karenanya, kami telah mencapai polimorfisme.
Jenis Polimorfisme
C++ mendukung dua jenis polimorfisme:
- Polimorfisme waktu kompilasi, dan
- Polimorfisme waktu proses.
Kompilasi Polimorfisme Waktu
Anda memanggil fungsi yang kelebihan beban dengan mencocokkan jumlah dan jenis argumen. Informasi ini hadir selama waktu kompilasi. Ini berarti C++ kompiler akan memilih fungsi yang tepat pada waktu kompilasi.
Polimorfisme waktu kompilasi dicapai melalui kelebihan fungsi dan kelebihan operator.
Fungsi Kelebihan Beban
Kelebihan fungsi terjadi ketika kita memiliki banyak fungsi dengan nama yang mirip tetapi argumennya berbeda. Argumennya mungkin berbeda dalam hal jumlah atau jenis.
Contoh 1
#include <iostream> using 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; }
Keluaran:
Berikut ini tangkapan layar kodenya:
Penjelasan Kode:
- Sertakan file header iostream ke dalam kode kita. Kami akan dapat menggunakan fungsinya.
- Sertakan namespace std dalam kode kita. Kita akan dapat menggunakan kelasnya tanpa memanggilnya.
- Buat fungsi bernama test yang mengambil parameter integer i. Tanda { menandai awal dari isi pengujian fungsi.
- Pernyataan yang akan dieksekusi jika tes fungsi di atas dipanggil/dipanggil.
- Akhir dari tes fungsi di atas.
- Buat fungsi bernama test yang mengambil parameter float f. Tanda { menandai awal dari isi pengujian fungsi.
- Pernyataan yang akan dieksekusi jika tes fungsi di atas dipanggil/dipanggil.
- Akhir dari isi tes fungsi di atas.
- Buat fungsi bernama test yang mengambil parameter karakter ch. Tanda { menandai awal dari isi pengujian fungsi.
- Pernyataan yang akan dieksekusi jika tes fungsi di atas dipanggil/dipanggil.
- Akhir dari isi tes fungsi di atas.
- Panggil fungsi main(). Tanda { menandai awal dari isi fungsi.
- Panggil fungsi test dan berikan 5 sebagai nilai argumen. Ini memanggil fungsi pengujian yang menerima argumen bilangan bulat, yaitu fungsi pengujian pertama.
- Panggil fungsi test dan berikan 5.5 sebagai nilai argumen. Ini akan memanggil fungsi pengujian yang menerima argumen float, yaitu fungsi pengujian kedua.
- Panggil fungsi test dan berikan lima sebagai nilai argumen. Ini akan memanggil fungsi pengujian yang menerima argumen karakter, yaitu fungsi pengujian ketiga.
- Program harus mengembalikan nilai jika berhasil dijalankan.
- Akhir dari isi fungsi main().
Kami memiliki tiga fungsi dengan nama yang sama tetapi tipe argumennya berbeda. Kami telah mencapai polimorfisme.
Operauntuk Kelebihan beban
In Operauntuk Kelebihan beban, kami mendefinisikan arti baru untuk a C++ operator. Operator ini juga mengubah cara kerja operator. Misalnya, kita dapat mendefinisikan operator + untuk menggabungkan dua string. Kita mengenalnya sebagai operator penjumlahan untuk menambahkan nilai numerik. Setelah definisi kita, ketika ditempatkan di antara bilangan bulat, operator ini akan menambahkannya. Ketika ditempatkan di antara string, operator ini akan menggabungkannya.
Contoh 2
#include<iostream> using 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(); }
Keluaran:
Berikut ini tangkapan layar kodenya:
Penjelasan Kode:
- Sertakan file header iostream ke dalam program kami untuk menggunakan fungsinya.
- Sertakan namespace std ke dalam program kita untuk menggunakan kelasnya tanpa memanggilnya.
- Buat kelas bernama ComplexNum. { menandai awal badan kelas.
- Gunakan pengubah akses privat untuk menandai variabel sebagai privat, artinya variabel hanya dapat diakses dari dalam kelas.
- Tentukan dua variabel integer, real dan over.
- Gunakan pengubah akses publik untuk menandai konstruktor sebagai publik, artinya konstruktor dapat diakses bahkan dari luar kelas.
- Buat konstruktor kelas dan inisialisasi variabel.
- Inisialisasi nilai variabel real.
- Inisialisasi nilai variabel di atas.
- Akhir dari badan konstruktor.
- Kita perlu mengesampingkan arti dari operator +.
- Buat hasil tipe data bertipe ComplexNum.
- Gunakan operator + dengan bilangan kompleks. Baris ini akan menambahkan bagian riil suatu bilangan ke bagian riil bilangan lain.
- Gunakan operator + dengan bilangan kompleks. Baris ini akan menambahkan bagian imajiner suatu bilangan ke bagian imajiner bilangan lain.
- Program akan mengembalikan nilai hasil variabel setelah eksekusi berhasil.
- Akhir dari definisi arti baru dari operator +, yaitu kelebihan beban.
- Panggil metode print().
- Cetak bilangan kompleks baru setelah penjumlahan pada konsol.
- Akhir dari isi fungsi print().
- Akhir badan kelas ComplexNum.
- Panggil fungsi main().
- Masukkan nilai bagian riil dan kompleks yang akan ditambahkan. Bagian pertama c1 akan ditambahkan ke bagian pertama c2, yaitu 10+3. Bagian kedua c1 akan ditambahkan ke bagian kedua c, yaitu 2+7.
- Lakukan operasi menggunakan operator + yang kelebihan beban dan simpan hasilnya dalam variabel c3.
- Cetak nilai variabel c3 di konsol.
- Akhir dari isi fungsi main().
Polimorfisme Waktu Proses
Hal ini terjadi ketika metode objek dipanggil/dipanggil saat runtime, bukan saat waktu kompilasi. Polimorfisme runtime dicapai melalui penggantian fungsi. Fungsi yang akan dipanggil/dipanggil ditetapkan selama runtime.
Penggantian Fungsi
Penggantian fungsi terjadi ketika fungsi kelas dasar diberikan definisi baru di kelas turunan. Pada saat itu, kita dapat mengatakan fungsi dasar telah diganti.
Sebagai contoh:
#include <iostream> using 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; }
Keluaran:
Berikut ini tangkapan layar kodenya:
Penjelasan Kode:
- Impor file header iostream ke program kami untuk menggunakan fungsinya.
- Sertakan namespace std ke dalam program kita untuk menggunakan kelasnya tanpa memanggilnya.
- Buat kelas bernama Mamalia. Tanda { menandai awal badan kelas.
- Gunakan pengubah akses publik untuk mengatur fungsi yang akan kita buat agar dapat diakses publik. Ini akan dapat diakses dari luar kelas ini.
- Buat fungsi publik bernama makan. Tanda { menandai awal dari isi fungsi.
- Cetak pernyataan yang ditambahkan ke fungsi cout ketika fungsi eat() dipanggil.
- Akhir dari isi fungsi makan().
- Akhir dari tubuh kelas Mamalia.
- Buat kelas bernama Sapi yang mewarisi kelas Mamalia. Sapi merupakan kelas turunan, sedangkan mamalia merupakan kelas dasar. Tanda { menandai awal kelas ini.
- Gunakan pengubah akses publik untuk menandai fungsi yang akan kita buat sebagai dapat diakses publik. Ini akan dapat diakses dari luar kelas ini.
- Ganti fungsi eat() yang didefinisikan di kelas dasar. Tanda { menandai awal dari isi fungsi.
- Pernyataan yang akan dicetak di konsol saat fungsi ini dipanggil.
- Akhir dari isi fungsi makan().
- Akhir dari badan kelas Sapi.
- Panggil fungsi main(). Tanda { menandai awal isi fungsi ini.
- Membuat instance dari kelas Cow dan memberinya nama c.
- Panggil fungsi eat() yang didefinisikan dalam kelas Cow.
- Program harus mengembalikan nilai setelah berhasil diselesaikan.
- Akhir dari fungsi main().
C++ Fungsi Maya
Fungsi virtual adalah cara lain untuk mengimplementasikan polimorfisme run-time C++. Ini adalah fungsi khusus yang didefinisikan di kelas dasar dan didefinisikan ulang di kelas turunan. Untuk mendeklarasikan fungsi virtual, Anda harus menggunakan kata kunci virtual. Kata kunci harus mendahului deklarasi fungsi di kelas dasar.
Jika kelas fungsi virtual diwarisi, kelas virtual akan mendefinisikan ulang fungsi virtual agar sesuai dengan kebutuhannya. Misalnya:
#include <iostream> using 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(); }
Keluaran:
Berikut ini tangkapan layar kodenya:
Penjelasan Kode:
- Sertakan file header iostream dalam kode untuk menggunakan fungsinya.
- Sertakan namespace std dalam kode kita untuk menggunakan kelasnya tanpa memanggilnya.
- Buat kelas bernama KelasA.
- Gunakan pengubah akses publik untuk menandai anggota kelas sebagai dapat diakses publik.
- Buat fungsi virtual bernama show(). Ini akan menjadi acara publik.
- Teks yang akan dicetak ketika show() dipanggil dipanggil. Ujungnya adalah a C++ kata kunci yang berarti garis akhir. Ini memindahkan kursor mouse ke baris berikutnya.
- Akhir dari isi fungsi virtual show().
- Akhir dari badan kelas KelasA.
- Membuat kelas baru bernama ClassB yang mewarisi kelas ClassA. KelasA menjadi kelas dasar sedangkan KelasB menjadi kelas turunan.
- Gunakan pengubah akses publik untuk menandai anggota kelas sebagai dapat diakses publik.
- Definisikan ulang fungsi virtual show() yang diturunkan di kelas dasar.
- Teks yang akan dicetak di konsol ketika fungsi show() yang didefinisikan dalam kelas turunan dipanggil.
- Akhir dari isi fungsi show().
- Akhir dari badan kelas turunan, KelasB.
- Panggil fungsi main(). Logika program harus ditambahkan di dalam tubuhnya.
- Buat variabel penunjuk bernama a. Itu menunjuk ke kelas bernama ClassA.
- Buat sebuah instance dari kelas bernama ClassB. Contohnya diberi nama b.
- Tetapkan nilai yang disimpan di alamat b dalam variabel a.
- Panggil fungsi show() yang ditentukan di kelas turunan. Pengikatan yang terlambat telah diterapkan.
- Akhir dari isi fungsi main().
Polimorfisme Waktu Kompilasi Vs. Polimorfisme Waktu Berjalan
Berikut perbedaan utama antara keduanya:
Polimorfisme waktu kompilasi | Polimorfisme waktu proses |
---|---|
Ini juga disebut polimorfisme pengikatan awal atau statis | Ini juga disebut pengikatan akhir/dinamis atau polimorfisme dinamis |
Metode ini dipanggil/dipanggil selama waktu kompilasi | Metode ini dipanggil/dipanggil selama run time |
Diimplementasikan melalui kelebihan fungsi dan kelebihan beban operator | Diimplementasikan melalui penggantian metode dan fungsi virtual |
Contohnya, metode yang kelebihan beban. Banyak metode yang mungkin memiliki nama serupa tetapi jumlah atau jenis argumennya berbeda | Misalnya, penggantian metode. Banyak metode yang mungkin memiliki nama serupa dan prototipe yang sama. |
Eksekusi lebih cepat karena penemuan metode dilakukan selama waktu kompilasi | Eksekusi lebih lambat karena penemu metode dilakukan saat runtime. |
Less fleksibilitas untuk pemecahan masalah disediakan karena semuanya diketahui selama waktu kompilasi. | Banyak fleksibilitas diberikan untuk memecahkan masalah rumit karena metode ditemukan saat runtime. |
Ringkasan
- Polimorfisme artinya mempunyai banyak bentuk.
- Itu terjadi ketika ada hierarki kelas yang dihubungkan melalui pewarisan.
- Dengan polimorfisme, suatu fungsi dapat berperilaku berbeda berdasarkan objek yang memanggil/memanggilnya.
- Dalam polimorfisme waktu kompilasi, fungsi yang akan dipanggil ditetapkan selama waktu kompilasi.
- Dalam polimorfisme runtime, fungsi yang akan dipanggil ditetapkan selama runtime.
- Polimorfisme waktu kompilasi ditentukan melalui kelebihan fungsi dan kelebihan operator.
- Dalam fungsi yang berlebihan, ada banyak fungsi dengan nama yang mirip tetapi argumennya berbeda.
- Parameternya dapat berbeda dalam jumlah atau jenis.
- Dalam kelebihan beban operator, arti baru didefinisikan C++ operator.
- Polimorfisme runtime dicapai melalui penggantian fungsi.
- Dalam penggantian fungsi, kelas turunan memberikan definisi baru pada fungsi yang ditentukan di kelas dasar.