Jump to content
Sign in to follow this  
troikasix

Virtual Function Dan Polymorphism Dalam Melayu

Recommended Posts

Kat sini saya cuba terangkan sikit pasal virtual function sbb dah ramai yang tanya. tapi susah nak faham. tak dinafikan, saya pun masih terkial2 nak faham. Bila dah faham, nak explain lagi susah.

Apa itu Virtual Function

Virtual Function adalah member function sesuatu (bapak) class yang mana functionalitynya boleh diubah oleh (anak/waris) derived class.

Ia adalah function yang dinyatakan mengguna 'virtual' keyword. Cth

virtual void buatKerja();
Sifat virtual pada function ni akan kekal sepanjang zuriat (bapak/tuk/nenek) base class sampai ke (anak/cucu/cicit) derived class. Jadi, sintaks 'virtual' tak perlu diulang lagi pada anak-anaknya. Apa itu Binding? Binding bermaksud ikatan sesuatu objek dari jenis 'class c' dgn member function dia. Kalau kita boleh panggil fungsi fn() sesuatu class c, kita katakan bhw objek itu 'binded' dgn fungsi fn(). Ini berlaku pada masa kompil dan dikenali sebagai statik atau compile-time binding. Untuk Virtual member pula, binding berlaku masa 'run-time'. Mekanisma ini dikenali sebagai 'dynamic binding'. Beza antara non-virtual dan virtual member adalah, non-virtual member di 'bind' masa kompil manakala 'virtual' bind berlaku run-time. Magik? tak lah. Meh kita operate. Tengok apa sebenarnya dalam tu Untuk class yg ada virtual function, satu v-table (virtual table) akan dibuat. Dalamnya ada senarai alamat untuk semua virtual function. Setiap object class tersebut pula akan mengandungi virtual pointer (vptr) di awalnya. vptr akan merujuk kpd permulaan virtual table dalam memory. Bila berlaku panggilan fungsi terhadap virtual function, v-table akan digunakan pada masa run-time mencari function addressnya. Ingat, class ada vtable. objek ada vptr. vptr tunjuk ke vtable. vtable tunjuk ke function. --fuhh penat. Oleh kerana wujudnya vptr dlm objek, saiz objek bertambah sebanyak saiz 1 pointer. vptr merujuk kepada base address virtual table dalam memori. note, virtual tables adalah specifik kpd satu jenis class. Cuma ada 1 virtual table utk setiap class tak kira berapa byk virtual function yg ada. Contoh kod utk mendapatkan efek polymorphism
#include <iostream.h>
 class Orang
 {
 public:
 virtual void kerja()
 {
   cout<<â€\nTak semua orang kerja, ada yang belajarâ€;
 }
 };
 class Pekerja : public Orang
 {
   public:
   void kerja()
   {
      cout<<â€\nPekerja buat kerjaâ€;
   }
 };

 void main()
 {

   Orang *ahmad = new Pekerja(); //pointer jenis Orang tapi guna Pekerja utk allocate memori
   ahmad->kerja(); //display "Pekerja buat kerja"
 }

Dalam contoh diatas, pointer ahmad adalah dari jenis Orang, tapi ia merujuk kepada class Pekerja. Fungsi kerja() bersifat virtual, jadi virtual table digunakan utk resolve nak pakai function yang mana.

Disini fungsi kerja() dlm class Pekerja akan dipanggil. Kalau ia tidak bersifat virtual, fungsi kerja dalam class Orang yang akan digunakan.

Virtual Constructors dan Destructors

Constructor tak boleh virtual sbb masa creation virtual table tak wujud lagi. Virtual destructor pulak perlu bagi memastikan destructor dipanggil dalam susunan yang betul. Kalau tak virtual, nanti derived class (anak) tak dipanggil masa delete. Ini menyebabkan memori leak.

Kesimpulan:

Mencari fungsi dalam v-table melibatkan overhed carian. virtual juga menokok saiz sesuatu objek dengan saiz pointer. Walaupun terdapat kelemahan, ttp ia amat berguna. Tak perlu bersikap negatif utk tidak menggunakannya. Takkan program yg ditulis dlm C++ kalah dari segi speed dan saiz berbanding bahasa lain apabila mengguna virtual.

Share this post


Link to post
Share on other sites

wah.. penerangan yg ringkas tapi cukup bagus dari xeonn.. gratz :) walaupun dah combine class, inheritance, polymorphism sekali gus, aku rasa masih senang nak difahami.

kat sini aku nak tunjuk ruby equivalence utk kod tersebut. aku harap korang semua dapat tangkap dgn cepat.

class Orang
  def kerja
    print "\nTak semua orang kerja, ada yang belajar\n"
  end
end

ali = Orang.new
ali.kerja

class Pekerja<Orang   #pewarisan dari kelas Orang
  def kerja                 #ubah balik definisi/method kerja
    print "\Pekerja buat kerja\n"
  end
end

ahmad = Pekerja.new
ahmad.kerja

p/s: dalam ruby, semua virtual :blush:

Share this post


Link to post
Share on other sites

Bila ko kata Ruby punya function semua virtual, nampak sangat topik ni penting. Sekarang aku kerja mmg banyak pakai virtual function. Menarik untuk di eksplore.

Untuk kengkawan kita suma, sumbangkanlah apa yang patut dalam thread ni supaya kita boleh beralih ke topik lain yang lebih mencabar. Saya search satu internet cari topik2 advance dalam bahasa melayu. Tak banyak. Pasni boleh bincang pasal Design Pattern. Putera.com akan jadi tempat perbincangan para professional.

Share this post


Link to post
Share on other sites

wah.. penerangan yg ringkas tapi cukup bagus dari xeonn.. gratz :) walaupun dah combine class, inheritance, polymorphism sekali gus, aku rasa masih senang nak difahami.

kat sini aku nak tunjuk ruby equivalence utk kod tersebut. aku harap korang semua dapat tangkap dgn cepat.

class Orang
  def kerja
    print "\nTak semua orang kerja, ada yang belajar\n"
  end
end

ali = Orang.new
ali.kerja

class Pekerja<Orang   #pewarisan dari kelas Orang
  def kerja                 #ubah balik definisi/method kerja
    print "\Pekerja buat kerja\n"
  end
end

ahmad = Pekerja.new
ahmad.kerja

p/s: dalam ruby, semua virtual :blush:

Pehal ni tuan mod, asyik sebut ruby je. Dah beralih arah ke? Lagi pun ni thread C++, tak sesuai la...

Share this post


Link to post
Share on other sites

sebab aku rasa thread ni mengenai polymorphism, takde salah nak bagi contoh dalam bahasa lain. lagi pun cara nak costruct class, nak guna inheritance, etc guna c++ little bit trivial berbanding bahasa mudah mcm ruby. sekarang ni aku tak pentingkan bahasa apa korang guna, yg penting 'the art of computer programming'. get things done.

sebagai contoh, korang boleh pegi http://projecteuler.net/index.php?section=view dan selesaikan soalan/masalah disitu. soalan tu tak specific nak kena pakai bahasa apa, yg penting result dia dan algo yg digunakan. computer programming bukan setakat tahu c++, tapi yg paling penting mcm mana nak guna programming language utk menyesaikan masalah. in the end, apabila korang dah tau camner nak utilize programming language, guna la bahasa apa2 pun even assembly; apa2 jenis masalah korang ada ability utk solve it.

yg membezakan jenis2 programming language(interpreted or compiled), sama ada korang nak execution speed or development speed or both. boleh combine, takde masalah. guna ruby or python utk gluing c/c++ codes.

p/s: its just about how to be a better programmer, not the leetness of using c/c++ :)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...