Kali ini ceritanya saya harus menjelaskan atau memberikan alasan dari hasil compilasi source code dibawah ini. sok atuh di compile (itu juga kalo mau repot ....hehe )
Source Code [C++]#include <iostream>
#include <conio.h>
#include <string.h>
using namespace std;
class Manusia
{
protected:
string nama;
string alamat;
public:
Manusia(string nama, string alamat):nama(nama), alamat(alamat){}
void judul ()
{
cout<<"\n Kelas Manusia!"<<endl ;
}
void tampil_data() //menggunakan fungsi vi rtu
{
cout<<"\n =========================";
cout<<"\n\t MANUSIA"<<endl ;
cout<<" =========================";
cout<<"\n Nama : "<<nama<<endl ;
cout<<" Alamat : "<<alamat<<endl ;
cout<<" ========================="<<endl ;
}
};
class Mahasiswa : public Manusia
{
private:
string nim;
string jurusan;
public:
Mahasiswa(string nim, string nama, string jurusan, string alamat):Manusia(nama,
alamat),nim(nim),jurusan(jurusan){}
void judul ()
{
cout<<"\n Kelas Mahasiswa!"<<endl ;
}
};
class Pegawai : public Manusia
{
private:
string nip;
string jabatan;
public:
Pegawai (string nip, string nama, string alamat, string jabatan):Manusia(nama,
alamat),nip(nip),jabatan(jabatan){}
void judul ()
{
cout<<"\n Kelas Pegawai !"<<endl ;
}
};
int main()
{
Mahasiswa mhs1("201081016", "Patricia", "Teknik Informatika", "Jakarta");
Pegawai peg1("4321.8765.1234", "Budi", "Surabaya","Di rektur");
Manusia *man; //definisi pointer ke objek berkelas manusia
man = &mhs1; //menunjuk ke objek berkelas mahasiswa
man->judul ();
man->tampil_data();
man = &peg1; //menunjuk ke objek pegawai
man->judul ();
man->tampil_data();
getch();
}
Gambar 1.0 |
kenapa judulnya bisa muncul classManusia (ditandai dengan kotak warna kuning) sedangkan datanya dari class Mahasiswa dan Pegawai (ditandai dnegan kotak warna orange)?
oke, mari kita review source code diatas.
class manusia (Gambar 1.1) |
class Mahasiswa (Gambar 1.2) |
class Pegawai (Gambar 1.3) |
fungsi main() (Gambar 1.4) |
pointer ini kegunaanya untuk menjuk alamat dari variabel yang di tunjuk. seperti yang kita lihat di baris ke 86, di situ class manusia di deklarasikan dengan variable pointer (*man) dan kemudian dibaris ke 88 dan baris 92 disamakanlah alamat variable dari class Manusia tersebut dengan class Mahasiswa (mhs1) dan class Pegawai (peg1).
terus kenapa ko tampilannya bisa seperti itu?
alasanya bukan terletak pada fungsi main() atau penggunakan variable pointer.
tetapi ada pada class Manusia tepatnya di method atau fungsi tampil_data().
method tampil_data() yang terdapat di class manusia ini bertype void dan di berikan fungsi virtual.
Nah, fungsi virual inilah yang menyebabkan kenapa fungsi tampilannya bisa seperi gambar 1.0
terus fungsi virtual sendiri kegunaanya untuk apa?
pertanyaan yang super sekali .. hehe
menurut hasil analisa saya, fungsi virual itu seperti bayangan atau bisa disebut juga fungsi cadangan. jadi, jika ada method atau fungsi yang sama (kembar dalam hal pemberian nama) dalam suatu pewarisan (inheritance) class dan salah satu fungsi tersebut adalah fungsi virtual, maka fungsi yang dicetak adalah bukan fungsi virutal tersebut. tetapi jika dalam suatu pewarisan (inheritance) class tidak ada method atau fungsi yang kembar (namanya sama) tetapi fungsi tersebut adalah virual, maka fungsi virtual itu lah yang akan di cetak.
gimana? apakah masih bingung dengan dongeng diatas?
oke, kita oprek source code kita lagi.
misalnya dari source code kita sebelumnya, kita hapus kata virtual pada method tampil_data(), jadi seperti gambar 1.5
maka tampilanya seperti berikut.
bedakan dengan hasil di gambar 1.1 ?
alasanya bukan terletak pada fungsi main() atau penggunakan variable pointer.
tetapi ada pada class Manusia tepatnya di method atau fungsi tampil_data().
method tampil_data() yang terdapat di class manusia ini bertype void dan di berikan fungsi virtual.
Nah, fungsi virual inilah yang menyebabkan kenapa fungsi tampilannya bisa seperi gambar 1.0
terus fungsi virtual sendiri kegunaanya untuk apa?
pertanyaan yang super sekali .. hehe
menurut hasil analisa saya, fungsi virual itu seperti bayangan atau bisa disebut juga fungsi cadangan. jadi, jika ada method atau fungsi yang sama (kembar dalam hal pemberian nama) dalam suatu pewarisan (inheritance) class dan salah satu fungsi tersebut adalah fungsi virtual, maka fungsi yang dicetak adalah bukan fungsi virutal tersebut. tetapi jika dalam suatu pewarisan (inheritance) class tidak ada method atau fungsi yang kembar (namanya sama) tetapi fungsi tersebut adalah virual, maka fungsi virtual itu lah yang akan di cetak.
gimana? apakah masih bingung dengan dongeng diatas?
oke, kita oprek source code kita lagi.
misalnya dari source code kita sebelumnya, kita hapus kata virtual pada method tampil_data(), jadi seperti gambar 1.5
class Manusia | tampil_data() tanpa virtual. (Gambar 1.5) |
Gambar 1.6 |
biar afdol, kita oprek 1 kali lagi.
kali ini kita method judul() dan method tampil_data() akan di berikan fungsi virual, seperti gambar 1.7 dibawah ini:
Gambar 1.7 |
Gambar 1.8 |
noh lihat, sekarang judul dan data yang ditampilkan sama, sama - sama dari mahasiswa dan sama - sama dari pegawai.
sudah paham kan? :)
tapi masih ada pertanyaan nih. gimana kalo di class anak tidak ada fungsi yang kembar dengan class indux?
jawab : ya seperti yang di jelaskan diatas, virtual itu kan fungsi bayangan atau cadangan, jadi jika tidak ada fungsi yang kembar antara class anak dan class indux, maka fungsi virtual itu sendiri yang akan dicetak.
contohnya gini. misalnya source code class indux (class Manusia) sama seperti Gambar 1.7.
tetapi di class anak (misalnya class mahasiswa) kita ubah fungsi void tampil_data() menjadi show_data(), jelasnya seperti berikut :
Gambar 1.9 |
maka akan tampil hasilnya seperti berikut.
Gambar 2.0 |
hasilnya berbeda lagi kan? untuk judul yang pertama dan data dibawahnya berbeda kelas.
Kesimpulan :
jadi fungsi virutal itu kegunaanya untuk menjadikan fungsi tersebut sebagai cadangan method / fungsi yang terdapat pada pewarisan (inherintance) class.
semoga tugasnya sesuai dengan apa yang diharapkan bang AsLab :).
Terima Kasih.