Memahami Polimorfisme C++: Panduan Praktis
Kata polimorfisme berarti memiliki banyak bentuk. Biasanya, polimorfisme terjadi ketika ada hierarki kelas dan mereka terkait oleh warisan.
Polimorfisme C++ berarti bahwa panggilan ke fungsi anggota akan menyebabkan fungsi berbeda dieksekusi tergantung pada tipe objek yang memanggil fungsi tersebut.
Pertimbangkan contoh berikut di mana kelas dasar telah diturunkan oleh dua kelas lainnya minus–
Live Demo
#include <iostream> using namespace std; class Shape { protected: int width, height; public: Shape( int a = 0, int b = 0){ width = a; height = b; } int area() { cout << "Parent class area :" <<endl; return 0; } }; class Rectangle: public Shape { public: Rectangle( int a = 0, int b = 0):Shape(a, b) { } int area () { cout << "Rectangle class area :" <<endl; return (width * height); } }; class Triangle: public Shape { public: Triangle( int a = 0, int b = 0):Shape(a, b) { } int area () { cout << "Triangle class area :" <<endl; return (width * height / 2); } }; // Fungsi utama untuk program int main() { Shape *shape; Rectangle rec(10,7); Triangle tri(10,5); // simpan alamat Rectangle shape = &rec; // panggil area rectangle. shape->area(); // simpan alamat Triangle shape = &tri; // panggil area triangle. shape->area(); return 0; }
Ketika kode di atas dikompilasi dan dieksekusi, menghasilkan hasil berikut minus–
Parent class area : Parent class area :
Alasan output yang salah adalah karena panggilan fungsi area() diatur sekali oleh compiler sebagai versi yang didefinisikan dalam kelas dasar. Ini disebut resolusi statis dari panggilan fungsi, atau linkage statis - panggilan fungsi ditetapkan sebelum program dieksekusi. Ini juga terkadang disebut early binding karena fungsi area() diatur selama kompilasi program.
Tetapi sekarang, mari kita lakukan modifikasi kecil dalam program kami dan tambahkan kata kunci virtual sebelum deklarasi area() dalam kelas Shape sehingga terlihat seperti ini minus–
class Shape { protected: int width, height; public: Shape( int a = 0, int b = 0) { width = a; height = b; } virtual int area() { cout << "Parent class area :" <<endl; return 0; } };
Setelah modifikasi kecil ini, ketika kode contoh sebelumnya dikompilasi dan dieksekusi, menghasilkan hasil berikut minus–
Rectangle class area Triangle class area
Kali ini, compiler melihat isi pointer daripada tipenya. Oleh karena itu, karena alamat objek dari kelas tri dan rec disimpan di *shape fungsi area() masing-masing dipanggil.
Seperti yang Anda lihat, masing-masing kelas anak memiliki implementasi terpisah untuk fungsi area(). Inilah cara polimorfisme umumnya digunakan. Anda memiliki kelas yang berbeda dengan fungsi yang sama namanya, dan bahkan parameter yang sama, tetapi dengan implementasi yang berbeda.
Fungsi Virtual
Fungsi virtual adalah fungsi dalam kelas dasar yang dideklarasikan menggunakan kata kunci virtual. Mendefinisikan dalam kelas dasar sebuah fungsi virtual, dengan versi lain dalam kelas turunan, memberi tahu compiler bahwa kita tidak ingin linkage statis untuk fungsi ini.
Yang kita inginkan adalah pemilihan fungsi yang akan dipanggil pada titik mana pun dalam program didasarkan pada jenis objek yang dipanggilnya. Jenis operasi ini disebut linkage dinamis, atau late binding.
Fungsi Virtual Murni
Mungkin Anda ingin menyertakan fungsi virtual dalam kelas dasar sehingga dapat didefinisikan ulang dalam kelas turunan untuk mencocokkan objek kelas tersebut, tetapi tidak ada definisi yang bermakna yang dapat Anda berikan untuk fungsi dalam kelas dasar.
Kita dapat mengubah fungsi virtual area() dalam kelas dasar menjadi berikut minus–
class Shape { protected: int width, height; public: Shape(int a = 0, int b = 0) { width = a; height = b; } // fungsi virtual murni virtual int area() = 0; };
= 0 memberi tahu compiler bahwa fungsi tidak memiliki tubuh dan fungsi virtual di atas akan disebut fungsi virtual murni.