Jump to content
Sign in to follow this  
krayz_underground

Berkenaan Virtual Function Utk C++

Recommended Posts

A'kum wahai para pengunjung laman web Putera dan tidak lupa juga kepada

pakar2 pengaturcaraan yang telah byk membantu saya..

kali ni saya kembali dgn persoalan mengenai virtual function...

saya pelajar jurusan sains komputer di Usm..Final exam juz around the corner..

tapi saya dok baca tentang virtual function lansung x fhm2..bukak nota pun ciput aje cite..

tu pun bercampur aduk..

jadi boleh x siapa2 yang pakar cite serba serbi tentang Virtual Function.apa kegunaan nya dan

bagaimana nak di implementasikan di dalam program yang bakal kita tulis..

minta tolong sape2..plzz

Share this post


Link to post
Share on other sites

virtual function dalam tajuk polimorphism ekk??

virtual fuction tu, apa yang aku faham, dia declare virtual function dekat base class, dan declare fuction biasa dekat derive class menggunakan nama yang sama, tapi isi yang berbeza..

fungsi dia, kita leh call virtual function nie pada class yang berbeza yang mana isinya berbeza.. contoh code:

class base{
public:

virtual void Vfunction()  // <-- nie kita declare untuk virtual function dalam base class...
{
cout<<"paparan dalam base class"; // <-nie akan di print jika function nie dipanggil melalui base class..
}

};

class derive : public base{ //<-declare untuk leh access public kat base class
public:

void Vfunction() // <- kita declare dengan nama function sama tanpa ada "virtual" di depan dia..
{
cout<<"paparan dalam derive class";
}

};

void main(){

base ob1; //<- declare satu object untuk base class
base ob2; //<- declare satu object untuk derive class

base *obP; //<-- syarat untuk virtual function mesti guna pointer, jadik nie declare untuk pointerkan object

obP=ob1; //<-- pointkan pada object dlam base class
obP->Vfunction(); //<-- ini akan memaparkan output " paparan dalam base class"

obP=ob2; <-- pointkan pada object dlam derive class
obP->Vfunction(); <-- ini akan memaparkan output " paparan dalam derive class"

}

harap membantu ;)

Share this post


Link to post
Share on other sites

terima kasih..aku dah baca code yang ko bagi..tp masih samar-samar lagi..aku masih x dapat tangkap pasal benda nih..dan sesungguhnya aku xtau nak pakai benda nih macam mana..

aku tanya member2 aku depa kata benda ni kita pakai supaya object yg baru kita buat x pakai value yang kita set sebelum buat object baru tu..

contohnya kalau aku dah buat satu object..aku dah ubah2 value dalam member class object mula2..

so bila aku declare object baru virtual function nih akan buatkan supaya object yang baru nih guna class tu mcm xda object lain penah guna..

maafla ayat aku berterabur..yela aku mmg x fhm pasal benda nih..

aku baca dlm lecture note lagi la sepatah haram aku x fhm..

Share this post


Link to post
Share on other sites

fungsi virtual function tu, kalau kita buat banyak class, dan guna virtual function, kita leh call function tu pada class yang kita nak...

kalau yang biasa, function tu hanya leh declare SEKALI jer dekat base class, dan xleh ubah dekat derive class... jadik kita leh panggil fungsi tu kat base class jer lah..

p/s: faham tak? aku sebenarnya xberapa pandai nak menerang kat orang... ;)

Share this post


Link to post
Share on other sites

lolz..

maksudnya kalau aku buat satu class..then dalam class tuh ada satu function aku set sebagai virtual..

maknanya kalau aku buat satu class yang baru then aku still leh pakai nama yang sama utk funtion call ke?

aduh mcm mana?betul ke pemahaman aku?

Share this post


Link to post
Share on other sites

hampir betul dah tu... cuba ko tengok balik coding yang aku bagi tu.. mintak2 cepat ahh faham.. ;) aku pon dah tahu nak terang camner.. huhuhu...

Share this post


Link to post
Share on other sites

Cam ni...

"Virtual function" adalah salah satu cara C++ mengimplemen keupayaan low level iaitu memanggil fungsi melalui pointer. Dengan cara ini sesuatu fungsi boleh dipanggil walaupun kodnya belum wujud lagi atau akan ditentukan kemudian. Ini memberikan peluang kepada sesuatu fungsi (biasanya yang telah di kompil dan berada di dalam library dan tak boleh diubah kodnye lagi) di tambah keupayaan atau sifat2 di masa akan datang.

Contoh:

Class KelasA

{

void BuatKije();

void virtual ShowError();

};

KelasA::BuatKije()

{

....

....

ShowError(); // Papar error.

....

....

}

KelasA::ShowError()

{

// Buat default implementation di sini

// Misalnya display mesej dlm bahasa Inggeris.

}

Koding kat atas ni adalah satu kelas mudah ngan 2 function iaitu BuatKije dan ShowError. Fungsi ShowError dipanggil oleh fungsi BuatKije. Kat bawah ni adalah contoh penggunaan klas ni:

KelasA KA;

KA.BuatKije(); // Di sini fungsi ShowError dlm KelasA akan digunakan.

Katalah kita nak tukar cara papar error bagi kelas tersebut tapi tak nak ubah benda-benda lain, jadi kita buat satu kelas baru, katakan KelasB yang diwarisi dari KelasA

KelasB : public KelasA

{

void virtual ShowError();

};

KelasB::ShowError()

{

// Kat sini buat implementasi baru

// Misalnya display mesej dlm bahasa Melayu.

}

Contoh penggunaan KelasB macam ni:

KelasB KB;

KB.BuatKije(); // Kat sini fungsi BuatKije yang sama dengan KelasA digunakan, tapi dgn memanggil fungsi ShowError yang baru dari kelasB.

Kalau kita perati kat sini, fungsi BuatKije dalam KelasA seolah-olah sudah tahu fungsi ShowError dari KelasB padahal KelasB masih belum wujud semasa KelasA dibentuk. Macam saya kata tadi, fungsi virtual adalah bagi membolehkan satu fungsi yang belum wujud di panggil.

Oleh kerana fungsi virtual adalah pointer, maka terdapat sejenis fungsi virtual yang dikenali sebagai "pure virtual". Dalam kes ni, kelas yang mendeklare fungsi tidak membuat langsung implementation bagi fungsi tersebut (tak ada default implementation). Ini bermakna kelas yang mewarisi (inherited) kelas tersebut mesti membuat implementation bagi fungsi-fungsi virtual yang "pure" dari base class, kalau tak compiler akan bagi error mesej.

Contoh deklarasi fungsi virtual yang pure mcm ni....

void virtual ShowError() = NULL;

Body atau implementation bagi fungsi ni tak ada (pointer di set ke NULL), tapi semua fungsi-fungsi lain (member) sudah boleh menggunakan fungsi ini.

Fungsi virtual banyak digunakan apabila kita membuat framework kerana kebanyakan implementasi akan ditentukan oleh kelas yang menggunakan framework tersebut. OK LA DULU.... HARAP2 BOLEH PAHAM LA YE........

Edited by CFoo++

Share this post


Link to post
Share on other sites

maknanya kan...base class punya function juz utk prototype jela?..

then setiap kali kita derived class baru kite leh pakai prototype yg sama but function definition lain2..

mcm tu?..

then bila kita call function tuh waktu runtime die akan select la mana satu function definition nak pakai kan?

betul x tu?

juz x reti nak pakai..pikir2 balik baik pakai nama function lain2...

sng cite.. muehehe :P

Share this post


Link to post
Share on other sites

Virtual function ni utk support konsep polymorphism didalam object oriented.

Kegunaannya ialah supaya kita boleh buat apa yg dipanggil "generic programming".

Katakan saya nak buat satu program yg tugasnya adalah untuk execute fungsi utk melukis berbagai bentuk.

Kalau ikut cara biasa, kita boleh guna case statement lebih kurang macam ni:

//Fail A.cpp

switch(bentuk)

{

case BULAT: fungsi_lukis_bulatan();

case SEGITIGA: fungsi_lukis_segitiga();

case SEGIEMPAT:fungsi_lukis_segiempat();

}

//Fail B.cpp

fungsi_lukis_bulatan() { //}

fungsi_lukis_segitiga() { //}

fungsi_lukis_segiempat() { // }

Kod ini biasanya berada didalam source kod yg berlainan dari fail yg mengandungi kod untuk fungsi_lukis.... yg digunakan.

Sekarang sekiranya saya ingin menambah fungsi baru - melukis polygon saya kena ubah kedua-dua fail A.cpp dan B.cpp. Spt dibawah ini:

//Fail A.cpp

switch(bentuk)

{

case BULAT: fungsi_lukis_bulatan();

case SEGITIGA: fungsi_lukis_segitiga();

case SEGIEMPAT:fungsi_lukis_segiempat();

case POLYGON: fungsi_lukis_polygon();

}

//Fail B.cpp

fungsi_lukis_bulatan() { //}

fungsi_lukis_segitiga() { //}

fungsi_lukis_segiempat() { // }

fungsi_lukis_polygon(){ // }

Kita tengok pula kalau kita guna konsep generic programming - ini kerana didalam design seboleh-bolehnya designer akan cuba delay menentukan sesuatu informasi tersebut selambat yg boleh - paling cepat ialah sekiranya semuanya perlu ditentukan semasa kompilasi (seperti contoh diatas). Apa-apa pernambahan memerlukan source kod dikompil semula. Paling bagus ialah dilewatkan sehingga "run time". Tak perlu re-kompil apa-apa - contoh macam konsep "plug -ins". Kalau kita guna macam Firefox plugin - kita boleh install run time - download, restart Firefox dan feature baru sudah boleh digunakan. User tak perlu nak reinstall applikasi. Developer yg buat plugin tak perlu nak suruh Firefox org punya orang utk re-compile firefox source code.

Kalau kod diatas menggunakan konsep generic programming/polymorphism:

//Fail A.cpp

fungsi_execute_lukis(Bentuk* instance_bentuk)

{

instance_bentuk->lukis();

}

//Fail B.h

class Bentuk

{

//Salah satu virtual function

virtual lukis() = 0; //default tak buat apa-apa

}

Sekarang katakan fail A.cpp dan B.cpp adalah base yg dijaga oleh orang lain.

Sekarang anda nak tambah melukis bentuk BINTANG. Anda tidak perlu utk menyentuh samada fail A atau B.

Cuma buat fail baru C.cpp

//C.cpp

//Include B.h supaya anda boleh inherit dari class BENTUK

#include "B.h"

class BENTUK-BINTANG: public BENTUK

{

lukis() { //lukis bintang;} //override virtual funtion dgn kita punya own kod utk lukis bintang.

}

//Main.cpp

//Utk menyuruh fungsi_execute_lukis utk melukis bentuk bintang atau lain-lain bentuk

//Lukis bintang

BENTUK* instance_bintang = new(BENTUK-BINTANG);

fungsi_execute_lukis(instance_bintang);

Perhatikan kita cuma mengujudkan kod dan data utk objek bintang sekiranya perlu.

Didalam contoh "switch-case" kod-kod utk semua jenis objek/drawing perlu di ujudkan walaupun kita mungkin hanya akan cuma menggunakan salah satu dari bentuk tersebut. Dalam banyak applikasi sesuatu objek boleh merupakan objek yg besar atau objek yg mempunyai dependency yg besar. Kebolehan utk mengujudkan hanya objek yg diperlukan berdasarkan "flow" atau pilihan pengguna (kata dlm contoh kita ada button "lukis bintang"...maka hanya kod yg mengujudkan bentuk bintang akan dipanggil) akan mengurangkan penggunaan memori (dan juga CPU) dengan banyak.

Itulah serba-sedikit tentang penggunaan virtual/polymorphism.

Lagi satu area yg banyak guna ni..."pattern". Check kat google.

Wallhualam...

Share this post


Link to post
Share on other sites

maknanya kan...base class punya function juz utk prototype jela?..

then setiap kali kita derived class baru kite leh pakai prototype yg sama but function definition lain2..

mcm tu?..

then bila kita call function tuh waktu runtime die akan select la mana satu function definition nak pakai kan?

betul x tu?

juz x reti nak pakai..pikir2 balik baik pakai nama function lain2...

sng cite.. muehehe :P

Lebih kurang macam tu la... Ala tak reti pakai pun tak pe. Dalam keadaan biasa bende ni jarang pakai, juz untuk buat generic programing macam yang Evo10 cite kat atas tu... Untuk buat program supaya orang lain boleh tukar-tukar (atau upgrade) pada masa depan. Kalau kite ada sume source code, tukar ajelah dalam source code asal bila nak upgrade program, tak payah pakai virtual... Aku banyak pakai bende ni untuk develop sofwer ClickAuthor supaya third party boleh buat plug-in dan tambah objek baru yang tak ada pada ClickAuthor. ClickAuthor ni adalah authoring tools, Malaysian made la...

Edited by CFoo++

Share this post


Link to post
Share on other sites

panjang lebar penerangan di beri kpd aku..

sungguh nya otak aku mmg lembab le..

aduh..

xpe,aku harap x kena pakai lg buat masa terdekat ni..

time ceh..

aku akan baca ulang2 byk kali sume penerangan yang di beri...

c-foo dah tgk ke code aku dkat topik yg satu lg tuh..

ada pape kelemahan x?..

kasi tunjuk sket..

ops off topic..soryy..

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...