Pointers to Base Class

2008 | Direktorat Pembinaan SMK 573 protected: int width, height; public: void set_values int a, int b { width=a; height=b; } }; class CRectangle: public CPolygon { public: int area void { return width height; } }; class CTriangle: public CPolygon { public: int area void { return width height 2 ; } }; int main { CRectangle rect; CTriangle trgl; CPolygon ppoly1 = rect; CPolygon ppoly2 = trgl; ppoly1‐set_values 4 , 5 ; ppoly2‐set_values 4 , 5 ; cout Rectangle area = rect.area endl; cout Triangle area = trgl.area endl; system PAUSE ; return EXIT_SUCCESS; } Keluaran program diatas adalah sebagai berikut: Rectangle area = 20 Triangle area = 10 Fungsi main membuat dua pointer yang menunjuk ke objek dari class CPolygon, yakni ppoly1 dan ppoly2. Kedua pointer tersebut diinisialisasi dengan alamat objek rect dan trgl, dan karena pointer tersebut merupakan objek class turunan dari Cpolygon, maka inisialisasi ini benar. Pointer ppoly1 dan ppoly2 dideklarasikan dari base class. Inisialisasi dengan rect dan trgl valid, namun pointer ppoly1 dan ppoly2 tetap tidak dapat mengakses member CRectangle dan CTriangle. 574 Direktorat Pembinaan SMK | 2008 Untuk alasan ini, ketika area dipanggil kita tidak mungkin menggunakan pointer ppoly1 dan ppoly2. Untuk membuat agar ppoly1 dan ppoly2 dapat memanggil area, maka harus dideklarasikan pada base classnya dan tidak hanya di class turunannya. Cara mendeklarasikannya dapat kita lihat di pembahasan materi Virtual members.

16.10.2. Virtual member

Untuk mendeklarasikan elemen sebuah kelas yang akan kita redefinisika di kelas turunan kita harus mendauluinya dengan keyword virtual maka pointer ke obyek yang menunjuk klas tersebut dapat digunakan dengan baik. Program 16.32 include iostream.h class CSegibanyak { protected: int lebar, tinggi; public: void set_nilai int a, int b { lebar=a; tinggi=b; } virtual int luas void { return ; } }; class CSegiempat: public CSegibanyak { public: int luas void { return lebar tinggi; } }; class CSegitiga: public CSegibanyak { public: int luas void { return lebar tinggi 2 ; } }; int main { CSegiempat rect; CSegitiga trgl; CSegibanyak poly; CSegibanyak ppoly1 = rect; CSegibanyak ppoly2 = trgl; 2008 | Direktorat Pembinaan SMK 575 CSegibanyak ppoly3 = poly; ppoly1‐set_nilai 4 , 5 ; ppoly2‐set_nilai 4 , 5 ; ppoly3‐set_nilai 4 , 5 ; cout ppoly1‐luas endl; cout ppoly2‐luas endl; cout ppoly3‐luas endl; system PAUSE ; return EXIT_SUCCESS; } Keluaran program diatas adalah sebagai berikut: 20 10 Sekarang kita punya 3 kelas CSegibanyak, CSegiempat dan CSegitiga yang memiliki anggota yang sama: lebar, tinggi, set_nilai dan luas. Luas telah didefinisikan sebagai virtual karena itu akan didefinisikan kembali pada kelas turunan. Anda dapat melakukan verifikasi jika anda ingin melakukannya dengan menghilangkan keyword virtual dari kode program diatas dan kemudian anda eksekusi program tersebut, hasil akan menhadi 0 untuk ketiga segibanyak bukannya 20,10,0. ini disebabkan karena pemanggilan terhadap obyek CSegiempat::luas, CSegitiga::luas dan CSegibanyak::luas, akan mengacu ke CSegibanyak::luas dan akan memanggil fungsi yang sama tersebut CSegibanyak::luas untuk semua pemanggilan melalui obyek kelas turunan karena pemanggilan- nya menggunakan pointer dengan tipe CSegibanyak. Ini menunjukan kepada anda tentang kegunaan dari keyword virtual, yang mengijinkan memberanggota dari kelas turunan dengan nama yang sama dengan member dari kelas dasar base class untuk dipanggil dari pointer dengan tipe kelas dasar bas e class tetapi melaksanakan fungsi tersebut yang didefinisikan pada kelas turunan. Untuk memahami polymorphism terlebih lanjut harus mengenal fungsi virtual karena fungsi ini merupakan dasarnya. Fungsi anggota dari suatu class dapat dijadikan fungsi virtual. Jika fungsi ini dideklarasikan kembali pada turunan dan suatu pointer yang menunjuk class dasar diciptakan, pointer dapat memilih obyek yang tepat sekiranya fungsi anggota tersebut dipanggil via pointer. Untuk lebih memahami lihat contoh berikut: Program 16.33 include cstdlib include iostream