Apa itu Polimorfisme di C ++?
Dalam C ++, polimorfisme menyebabkan fungsi anggota berperilaku berbeda berdasarkan objek yang memanggil / memanggilnya. Polimorfisme adalah kata Yunani yang artinya memiliki banyak bentuk. Ini terjadi ketika Anda memiliki hierarki kelas yang terkait melalui warisan.
Misalnya, kita memiliki fungsi makeSound (). Saat kucing memanggil fungsi ini, ia akan menghasilkan suara meong. Saat seekor sapi menjalankan fungsi yang sama, itu akan menghasilkan suara moow.
Meskipun kita memiliki satu fungsi, itu berperilaku berbeda dalam keadaan yang berbeda. Fungsinya memiliki banyak bentuk; karenanya, kami telah mencapai polimorfisme.
Dalam tutorial C ++ ini, Anda akan mempelajari:
- Apa itu Polimorfisme?
- Jenis Polimorfisme
- Kompilasi Polimorfisme Waktu
- Fungsi Overloading
- Operator Berlebihan
- Polimorfisme Waktu Proses
- Fungsi Mengganti
- Fungsi Virtual C ++
- Polimorfisme Waktu Kompilasi Vs. Polimorfisme Run-Time
Jenis Polimorfisme
C ++ mendukung dua jenis polimorfisme:
- Polimorfisme waktu kompilasi, dan
- Polimorfisme runtime.
Kompilasi Polimorfisme Waktu
Anda memanggil fungsi yang kelebihan beban dengan mencocokkan jumlah dan jenis argumen. Informasi ini ada selama waktu kompilasi. Ini berarti compiler C ++ akan memilih fungsi yang tepat pada waktu kompilasi.
Polimorfisme waktu kompilasi dicapai melalui kelebihan beban fungsi dan kelebihan beban operator.
Fungsi Overloading
Kelebihan fungsi terjadi ketika kita memiliki banyak fungsi dengan nama yang mirip tetapi dengan argumen yang berbeda. Argumen mungkin berbeda dalam hal jumlah 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;}
Keluaran:
Berikut tangkapan layar kodenya:
Penjelasan Kode:
- Sertakan file header iostream ke dalam kode kami. Kami akan dapat menggunakan fungsinya.
- Sertakan namespace std dalam kode kami. Kami akan dapat menggunakan kelasnya tanpa memanggilnya.
- Buat fungsi bernama test yang mengambil parameter integer i. Tanda {menandai awal dari pengujian fungsi tubuh.
- Pernyataan yang akan dieksekusi jika uji fungsi di atas dipanggil / dipanggil.
- Akhir tubuh uji fungsi di atas.
- Buat fungsi bernama test yang menggunakan parameter float f. Tanda {menandai awal dari pengujian fungsi tubuh.
- Pernyataan yang akan dieksekusi jika uji fungsi di atas dipanggil / dipanggil.
- Akhir tubuh uji fungsi di atas.
- Buat fungsi bernama tes yang mengambil parameter karakter ch. Tanda {menandai awal dari pengujian fungsi tubuh.
- Pernyataan yang akan dieksekusi jika uji fungsi di atas dipanggil / dipanggil.
- Akhir tubuh uji fungsi di atas.
- Panggil fungsi main (). Tanda {menandai awal badan fungsi.
- Panggil uji fungsi dan teruskan 5 sebagai nilai argumen. Ini memanggil fungsi pengujian yang menerima argumen integer, yaitu fungsi pengujian pertama.
- Panggil uji fungsi dan teruskan 5,5 ke sana sebagai nilai argumen. Ini akan memanggil fungsi pengujian yang menerima argumen float, yaitu fungsi pengujian kedua.
- Panggil uji fungsi dan lewati lima sebagai nilai argumen. Ini akan memanggil fungsi tes yang menerima argumen karakter, yaitu fungsi tes ketiga.
- Program harus mengembalikan nilai jika berhasil dijalankan.
- Akhir badan fungsi main ().
Kami memiliki tiga fungsi dengan nama yang sama tetapi jenis argumen yang berbeda. Kami telah mencapai polimorfisme.
Operator Berlebihan
Dalam Operator Overloading, kami mendefinisikan arti baru untuk operator C ++. 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 kami, ketika ditempatkan di antara bilangan bulat, itu akan menambahkannya. Saat ditempatkan di antara string, itu 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();}
Keluaran:
Berikut 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. Tanda {menandai awal dari badan kelas.
- Gunakan pengubah akses pribadi untuk menandai variabel sebagai pribadi, 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 itu akan dapat diakses bahkan dari luar kelas.
- Buat konstruktor kelas dan inisialisasi variabel.
- Inisialisasi nilai variabel nyata.
- Inisialisasi nilai variabel di atas.
- Akhir badan konstruktor.
- Kita perlu mengesampingkan arti dari operator +.
- Buat tipe data hasil tipe ComplexNum.
- Gunakan operator + dengan bilangan kompleks. Baris ini akan menambahkan bagian nyata dari sebuah bilangan ke bagian nyata dari bilangan lain.
- Gunakan operator + dengan bilangan kompleks. Garis ini akan menambahkan bagian imajiner dari sebuah bilangan ke bagian imajiner dari bilangan lain.
- Program akan mengembalikan nilai hasil variabel setelah eksekusi berhasil.
- Akhir dari definisi arti baru dari + operator, yaitu overloading.
- Panggil metode print ().
- Cetak bilangan kompleks baru setelah penambahan di konsol.
- Akhir badan fungsi print ().
- Akhir badan kelas ComplexNum.
- Panggil fungsi main ().
- Teruskan nilai bagian nyata dan kompleks yang akan ditambahkan. Bagian pertama dari c1 akan ditambahkan ke bagian pertama dari c2, yaitu 10 + 3. Bagian kedua dari c1 akan ditambahkan ke bagian kedua dari c, yaitu 2 + 7.
- Lakukan operasi menggunakan operator + yang kelebihan beban dan simpan hasilnya dalam variabel c3.
- Cetak nilai variabel c3 di konsol.
- Akhir badan fungsi main ().
Polimorfisme Waktu Proses
Ini terjadi ketika metode objek dipanggil / dipanggil selama waktu proses daripada selama waktu kompilasi. Polimorfisme runtime dicapai melalui penggantian fungsi. Fungsi yang akan dipanggil / dipanggil ditetapkan selama runtime.
Fungsi Mengganti
Penimpaan fungsi terjadi ketika fungsi kelas dasar diberikan definisi baru dalam kelas turunan. Pada saat itu, kita dapat mengatakan bahwa fungsi dasar 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;}
Keluaran:
Berikut tangkapan layar kodenya:
Penjelasan Kode:
- Impor 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 Mamalia. Tanda {menandai awal dari badan kelas.
- Gunakan pengubah akses publik untuk menyetel fungsi yang akan kita buat sebagai dapat diakses publik. Ini akan dapat diakses dari luar kelas ini.
- Buat fungsi publik bernama makan. Tanda {menandai awal dari badan fungsi.
- Cetak pernyataan yang ditambahkan ke fungsi cout ketika fungsi eat () dipanggil.
- Akhir dari fungsi tubuh makan ().
- Akhir dari tubuh mamalia kelas.
- Buat kelas bernama Sapi yang mewarisi kelas Mamalia. Sapi adalah kelas turunan, sedangkan Mamalia adalah kelas dasar. Tanda {menandai awal dari 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 telah ditentukan di kelas dasar. Tanda {menandai awal dari badan fungsi.
- Pernyataan yang akan dicetak di konsol saat fungsi ini dipanggil.
- Akhir dari fungsi tubuh makan ().
- Akhir dari tubuh sapi kelas.
- Panggil fungsi main (). Tanda {menandai awal tubuh dari fungsi ini.
- Buat instance dari kelas Sapi dan beri nama c.
- Panggil fungsi eat () yang ditentukan di kelas Sapi.
- Program harus mengembalikan nilai setelah berhasil diselesaikan.
- Akhir dari fungsi main ().
Fungsi Virtual C ++
Fungsi virtual adalah cara lain untuk mengimplementasikan polimorfisme run-time di 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 diwariskan, kelas virtual tersebut akan mengubah fungsi virtual agar sesuai dengan kebutuhannya. 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();}
Keluaran:
Berikut 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 ClassA.
- 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. Endl adalah kata kunci C ++, yang berarti garis akhir. Ini menggerakkan kursor mouse ke baris berikutnya.
- Akhir badan show () fungsi virtual.
- Akhir tubuh 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 saat fungsi show () yang ditentukan di kelas turunan dipanggil.
- Akhir dari fungsi show ().
- Akhir 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 instance dari kelas bernama ClassB. Instance tersebut diberi nama b.
- Tetapkan nilai yang disimpan di alamat b dalam variabel a.
- Panggil fungsi show () yang ditentukan di kelas turunan. Pengikatan terlambat telah diterapkan.
- Akhir badan fungsi main ().
Polimorfisme Waktu Kompilasi Vs. Polimorfisme Run-Time
Inilah perbedaan utama antara keduanya:
Polimorfisme waktu kompilasi | Polimorfisme run-time |
Ini juga disebut pengikatan awal atau polimorfisme statis | Ini juga disebut pengikatan akhir / dinamis atau polimorfisme dinamis |
Metode ini dipanggil / dipanggil selama waktu kompilasi | Metode ini dipanggil / dipanggil selama run time |
Diterapkan melalui kelebihan beban fungsi dan kelebihan beban operator | Diimplementasikan melalui metode overriding dan fungsi virtual |
Contoh, metode overloading. Banyak metode mungkin memiliki nama yang mirip tetapi jumlah atau jenis argumen yang berbeda | Contoh, penggantian metode. Banyak metode mungkin memiliki nama yang mirip dan prototipe yang sama. |
Eksekusi lebih cepat karena penemuan metode dilakukan selama waktu kompilasi | Eksekusi lebih lambat karena penemu metode dilakukan selama waktu proses. |
Fleksibilitas yang lebih rendah untuk pemecahan masalah disediakan karena semuanya diketahui selama waktu kompilasi. | Banyak fleksibilitas disediakan untuk memecahkan masalah kompleks karena metode ditemukan selama runtime. |
Ringkasan:
- Polimorfisme artinya memiliki banyak bentuk.
- Itu terjadi ketika ada hierarki kelas yang terkait melalui warisan.
- 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 beban fungsi dan kelebihan beban operator.
- Pada function overloading, terdapat banyak fungsi dengan nama yang mirip tetapi dengan argumen yang berbeda.
- Parameter dapat berbeda dalam jumlah atau jenis.
- Dalam operator overloading, arti baru didefinisikan untuk operator C ++.
- Polimorfisme runtime dicapai melalui penggantian fungsi.
- Dalam penggantian fungsi, kelas turunan memberikan definisi baru ke fungsi yang ditentukan di kelas dasar.