Tuesday 20 May 2014

TUGAS PBO KE - 4 | polymorphism

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();
}

jika source code diatas dicompile maka akan menghasilkan tampilan seperti dibawah ini:
Gambar 1.0
coba perhatikan, kenapa hasilnya bisa seperti itu?
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 Manusia merupakan class indux dari program kita kali ini. class ini memiliki 2 properties yang bersifat protected dan mempunyai method atau fungsi yang bernama void judul() dan virtual void tampil_data().


class Mahasiswa (Gambar 1.2)
class mahasiswa merupakan class anak dari class Manusia. class ini mempunyai 2 properties yang bersifat private dan mempunyai 2 method atau fungsi yang nama void judul() dan void tampil_data().


class Pegawai (Gambar 1.3)
untuk penjelasan class Pegawai ini sama penjelasannya dengan class Mahasiswa.


fungsi main() (Gambar 1.4)
untuk fungsi main(), syntax -syntaxnya sama seperti biasanya, namun kali ini ada penggunaan pointer.
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

class Manusia | tampil_data() tanpa virtual. (Gambar 1.5)
maka tampilanya seperti berikut.
Gambar 1.6
bedakan dengan hasil di gambar 1.1 ?


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
source code diatas akan menghasilkan tampilan seperti berikut.
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.

1 comments:

  1. method apa aja yg ada didalam nya gan ?
    apa ada polymorpism dan template nya ?

    ReplyDelete

My Website