Polimorfisme
Polimorfisme
POLIMORFISME
Polimorfisme (polymorphism) erat kaitannya dengan Pewarisan. Polimorfisme adalah pemikiran bahwa objek dinamis suatu kelas dasar dapat berperilaku seperti kelas turunan. Ketika objek tersebut menunjuk kelas dasar, objek tersebut berperilaku seperti kelas dasar, tetapi ketika objek tersebut menunjuk kelas turunan, objek tersebut berperilaku seperti kelas turunan. Dalam hal ini objek dapat memiliki beberapa bentuk, tergantung pada saat itu kelas mana yang ditunjuk. Yang perlu menjadi catatan, bahwa perubahan perilaku ini dari kelas dasar kepada kelas turunan, tidak dapat objek kelas turunan menunjuk kelas dasar. Polimorfisme dimungkinkan karena adanya mekanisme ikatan dinamis (dynamic binding). Ikatan dinamis adalah ikatan yang terjadi pada saat program dijalankan (runtime). Ikatan yang terjadi pada saat kompile disebut ikatan statis. Ikatan dinamis hanya dapat terjadi antara suatu objek dinamis dengan metode yang dinamis juga, dalam hal ini metode virtualnya (maya). A. Polimorfisme Pada Pewarisan Tunggal Suatu metode dapat dideklarasikan secara virtual dengan cara menambah kata virtual pada deklarasi fungsi. Jika suatu metode dideklarasikan secara virtual dalam kelas dasar, maka keadaan virtual tetap akan berlaku untuk fungsi yang sama di seluruh kelas turunan meskipun kata virtual tidak disebutkan. Untuk menjelaskan tentang ikatan dinamis dalam hubungannya dengan polimorfisme, perhatikan rancangan kelas berikut ini :
class A
{ public: tipe fungsi_statis(); tipe virtual fungsi_virtual(); }; class B : public A { public: tipe fungsi_statis(); tipe fungsi_virtual(); }; class C : public B { public: tipe fungsi_statis(); tipe fungsi_virtual(); }; Hirarki kelas yang digambarkan oleh rancangan kelas diatas berupa Pewarisan Tunggal. Jika diciptakan objek dinamis kelas A, maka objek ini dapat diubah bentuknya menjadi (menunjuk) objek kelas B dan objek kelas C. Jika diciptakan objek dinamis kelas B, maka objek ini dapat diubah bentuknya menjadi objek kelas C tetapi tidak dapat diubah menjadi objek kelas A. Sehingga perubahan bentuk hanya berlaku dari kelas dasar menjadi kelas turunan. Pada masing-masing kelas terdapat metode fungsi_statis() dan fungsi_virtual(). Meskipun secara eksplisit fungsi virtual() hanya dideklarasikan secara virtual pada kelas A, secara otomatis fungsi_virtual() pada kelas B dan kelas C juga berupa fungsi virtual. Jika diciptakan objek dinamis kelas A, maka objek ini dapat diubah bentuknya menjadi objek kelas B dan kelas C, sehingga ikatan dinamis hanya dapat terjadi antara objek tersebut dengan fungsi_virtual() dari kelas A, fungsi_virtual() dari kelas B dan fungsi_virtual() dari kelas C. Ikatan dinamis tidak mungkin terjadi dengan fungsi_statis dari kelas B maupun kelas C. Jika yang diciptakan objek dinamis kelas B, maka objek ini hanya dapat mengadakan ikatan dinamis dengan fungsi_virtual() dari kelas C saja. Hal ini sesuai PUSAT PENGEMBANGAN BAHAN AJAR UMB Harni Kusniyati ST. C++
Ikatan Statis
Ikatan Dinamis
main () { kuda *pkd; pkd=new kuda; PUSAT PENGEMBANGAN BAHAN AJAR UMB Harni Kusniyati ST. C++
Hasil Eksekusi:
Program diatas menunjukan bahwa objek dinamis pkd dari kelas dasar kuda dapat berbentuk kelas Pegasus. Demikian juga objek dinamis pbr dari kelas dasar burung dapat berbentuk kelas Pegasus. Tetapi objek dinamis pkd tidak dapat berbentuk kelas burung, begitu juga sebaliknya, objek dinamis pbr dari kelas burung tidak dapat berubah bentuk menjadi kelas kuda. Sehingga peryataan di bawah ini akan menyebabkan kesalahan : pkd = new burung; pbr = new kuda; // salah // salah Harni Kusniyati ST. C++
Hasil Eksekusi: