Anda di halaman 1dari 18
POLYMORPHISM Oleh: Rasim Ilkom- FPMIPA Universitas Pendidikan Indonesia
POLYMORPHISM
Oleh:
Rasim
Ilkom- FPMIPA
Universitas Pendidikan Indonesia
Fungsi Virtual  Dasar dari Polymorphism  Suatu fungsi anggota dari suatu kelas dapat dijadikan
Fungsi Virtual  Dasar dari Polymorphism  Suatu fungsi anggota dari suatu kelas dapat dijadikan
Fungsi Virtual  Dasar dari Polymorphism  Suatu fungsi anggota dari suatu kelas dapat dijadikan
Fungsi Virtual  Dasar dari Polymorphism  Suatu fungsi anggota dari suatu kelas dapat dijadikan

Fungsi Virtual

Dasar dari Polymorphism

Suatu fungsi anggota dari suatu kelas dapat dijadikan sebagai kelas virtual, dengan cara:

mendeklarasikan fungsi tsb pada kelas

turunan dan suatu pointer mennjuk kelas

induk.

Pointer dapat memilih object yang tepat pada saat fungsi anggota tsb dipanggil via pointer

Pointer didefinisikan menunjuk kelas induk Kelas induk Pointer Pointer dapat menunjuk ke object berkelas turunan
Pointer didefinisikan menunjuk kelas induk Kelas induk Pointer Pointer dapat menunjuk ke object berkelas turunan
Pointer didefinisikan menunjuk kelas induk Kelas induk Pointer Pointer dapat menunjuk ke object berkelas turunan
Pointer didefinisikan menunjuk kelas induk Kelas induk Pointer Pointer dapat menunjuk ke object berkelas turunan
Pointer didefinisikan menunjuk kelas induk Kelas induk
Pointer didefinisikan
menunjuk kelas induk
Kelas induk
Pointer didefinisikan menunjuk kelas induk Kelas induk Pointer Pointer dapat menunjuk ke object berkelas turunan
Pointer Pointer dapat menunjuk ke object berkelas turunan
Pointer
Pointer dapat
menunjuk ke object
berkelas turunan
kelas induk Kelas induk Pointer Pointer dapat menunjuk ke object berkelas turunan Kelas Turunan 1 Kelas
kelas induk Kelas induk Pointer Pointer dapat menunjuk ke object berkelas turunan Kelas Turunan 1 Kelas

Kelas Turunan

1

kelas induk Kelas induk Pointer Pointer dapat menunjuk ke object berkelas turunan Kelas Turunan 1 Kelas

Kelas Turunan

2

kelas induk Kelas induk Pointer Pointer dapat menunjuk ke object berkelas turunan Kelas Turunan 1 Kelas
Class Mahluk{ public: void info(){ cout <<“Informasi() pada mahluk ….” << endl; } virtual
Class Mahluk{ public: void info(){ cout <<“Informasi() pada mahluk ….” << endl; } virtual
Class Mahluk{ public: void info(){ cout <<“Informasi() pada mahluk ….” << endl; } virtual
Class Mahluk{ public: void info(){ cout <<“Informasi() pada mahluk ….” << endl; } virtual void

Class Mahluk{

public:

void info(){ cout <<“Informasi() pada mahluk ….” << endl;

}

virtual void keterangan(){ cout << “Keterangan () pada mahluk … “ << endl;

}

}; Class Mamalia: public Mahluk{ public:

void info(){ cout << “Informasi () pada Mamalia….” << endl;

}

void keterangan(){ cout<<“Keterangan() pada Mamalia …” <<endl;

};

}

Class Sapi: public Mamalia{ public: void info(){ cout <<“Informasi() pada Sapi ….” << endl; }
Class Sapi: public Mamalia{ public: void info(){ cout <<“Informasi() pada Sapi ….” << endl; }
Class Sapi: public Mamalia{ public: void info(){ cout <<“Informasi() pada Sapi ….” << endl; }
Class Sapi: public Mamalia{ public: void info(){ cout <<“Informasi() pada Sapi ….” << endl; }

Class Sapi: public Mamalia{

public:

void info(){ cout <<“Informasi() pada Sapi ….” << endl;

}

void keterangan(){ cout << “Keterangan () pada Sapi … “ << endl;

}

}; Void Main() { Mamalia mamalia;

Sapi sapi_sumba; Mahluk *binatang;

binatang=&mamalia;

binatanginfo();

binatangketerangan();

cout<<“----------------------”<<endl;

Binatang = &sapi_sumba; Binatanginfo(); Binatangketerangan();

};

Pointer didefinisikan menunjuk kelas induk Fungsi Virtual
Pointer didefinisikan
menunjuk kelas induk
Fungsi Virtual
Mamalia Virtual keterangan() binatang Kelas induk Binatangketerangan() Object : Mamalia Kelas Turunan Sapi_Sumba
Mamalia
Virtual keterangan()
binatang
Kelas induk
Binatangketerangan()
Object : Mamalia
Kelas Turunan
Sapi_Sumba
1

binatang

Virtual keterangan()

Virtual keterangan()

Binatangketerangan()

1 binatang Virtual keterangan() Binatang  keterangan() Object : sapi_sumba Virtual keterangan() Kelas Turunan 2

Object : sapi_sumba

Virtual keterangan()

Virtual keterangan()
1 binatang Virtual keterangan() Binatang  keterangan() Object : sapi_sumba Virtual keterangan() Kelas Turunan 2

Kelas Turunan

2

Pointer didefinisikan menunjuk kelas induk Fungsi Bukan Virtual
Pointer didefinisikan
menunjuk kelas induk
Fungsi Bukan Virtual
Mamalia Virtual keterangan() binatang Kelas induk Binatangketerangan() Virtual keterangan() Kelas Turunan
Mamalia
Virtual keterangan()
binatang
Kelas induk
Binatangketerangan()
Virtual keterangan()
Kelas Turunan
Sapi_Sumba
1
binatang

Binatangketerangan()

Object : sapi_sumba

Virtual keterangan()

Virtual keterangan()
Turunan Sapi_Sumba 1 binatang Binatang  keterangan() Object : sapi_sumba Virtual keterangan() Kelas Turunan 2

Kelas Turunan

2

Selayang Polymorphism  Akibat dari pewarisan, dapat menimbulkan polymorphism  Artinya: pada saat yang sama
Selayang Polymorphism  Akibat dari pewarisan, dapat menimbulkan polymorphism  Artinya: pada saat yang sama
Selayang Polymorphism  Akibat dari pewarisan, dapat menimbulkan polymorphism  Artinya: pada saat yang sama
Selayang Polymorphism  Akibat dari pewarisan, dapat menimbulkan polymorphism  Artinya: pada saat yang sama

Selayang Polymorphism

Akibat dari pewarisan, dapat menimbulkan polymorphism

Artinya: pada saat yang sama sebuah reference dapat mengacu ke object yang berbeda kelasnya (namun harus se-keturunan)

Jika dideklarasikan:

P : Poligon;

R : Rectangle; // Rectangle adalah poligon

T : Triangle;

// Triangle adalah poligon

Selayang Polymorphism  Polymorphism dapat beroperasi pada 2 aras:  Saat kompilasi  Saat Eksekusi
Selayang Polymorphism  Polymorphism dapat beroperasi pada 2 aras:  Saat kompilasi  Saat Eksekusi
Selayang Polymorphism  Polymorphism dapat beroperasi pada 2 aras:  Saat kompilasi  Saat Eksekusi
Selayang Polymorphism  Polymorphism dapat beroperasi pada 2 aras:  Saat kompilasi  Saat Eksekusi

Selayang Polymorphism

Polymorphism dapat beroperasi pada 2 aras:

Saat kompilasi

Saat Eksekusi

Overloading fungsi dan operator adalah polymorphism saat kompilasi

Polymorphism pada C++ adalah polymorphism saat eksekusi (late binding/ dynamic binding)

Bentuk ini dapat menangani dua atau lebih bentuk object sesuai dengan lingkungan object bersangkutan

 Karena kecocokan type antara induk dan turunannya, maka  P = R; // valid
 Karena kecocokan type antara induk dan turunannya, maka  P = R; // valid
 Karena kecocokan type antara induk dan turunannya, maka  P = R; // valid
 Karena kecocokan type antara induk dan turunannya, maka  P = R; // valid

Karena kecocokan type antara induk dan turunannya, maka

P = R; // valid

P = T; // valid

P
P
 Karena kecocokan type antara induk dan turunannya, maka  P = R; // valid 
 Karena kecocokan type antara induk dan turunannya, maka  P = R; // valid 
 Karena kecocokan type antara induk dan turunannya, maka  P = R; // valid 
R
R
 Karena kecocokan type antara induk dan turunannya, maka  P = R; // valid 
 Karena kecocokan type antara induk dan turunannya, maka  P = R; // valid 
 Karena kecocokan type antara induk dan turunannya, maka  P = R; // valid 
Fungsi Virtual Murni & Class Abstrak  Fungsi virtual yang tidak dipakai dalam program karena
Fungsi Virtual Murni & Class Abstrak  Fungsi virtual yang tidak dipakai dalam program karena
Fungsi Virtual Murni & Class Abstrak  Fungsi virtual yang tidak dipakai dalam program karena
Fungsi Virtual Murni & Class Abstrak  Fungsi virtual yang tidak dipakai dalam program karena

Fungsi Virtual Murni & Class Abstrak

Fungsi virtual yang tidak dipakai dalam program karena fungsi tersebut dipakai oleh objek yang ditunjuk

Dari contoh virtual void keterangan() pada class mahluk.

Oleh sebab itu dapat disingkirkan dengan cara:

Virtual void keterangan()=0;

Fungsi virtual murni biasanya dipakai sebagai kelas abstrak

Kelas Abstrak  Adalah kelas yang dideklarasikan idak untuk menciptakan object.  Cirinya:  Mengandung
Kelas Abstrak  Adalah kelas yang dideklarasikan idak untuk menciptakan object.  Cirinya:  Mengandung
Kelas Abstrak  Adalah kelas yang dideklarasikan idak untuk menciptakan object.  Cirinya:  Mengandung
Kelas Abstrak  Adalah kelas yang dideklarasikan idak untuk menciptakan object.  Cirinya:  Mengandung

Kelas Abstrak

Adalah kelas yang dideklarasikan idak untuk menciptakan object.

Cirinya:

Mengandung paling tidak sebuah fungsi virtual

murni

Sehingga:

Mahluk binatang

Mahluk *binatang

paling tidak sebuah fungsi virtual murni  Sehingga:  Mahluk binatang  Mahluk *binatang Boleh Tidak
paling tidak sebuah fungsi virtual murni  Sehingga:  Mahluk binatang  Mahluk *binatang Boleh Tidak

Boleh

Tidak

boleh

Class Mahluk{ public: virtual void keterangan(){ cout << “Keterangan () pada mahluk … “ <<
Class Mahluk{ public: virtual void keterangan(){ cout << “Keterangan () pada mahluk … “ <<
Class Mahluk{ public: virtual void keterangan(){ cout << “Keterangan () pada mahluk … “ <<

Class Mahluk{ public:

Class Mahluk{ public: virtual void keterangan(){ cout << “Keterangan () pada mahluk … “ << endl;

virtual void keterangan(){ cout << “Keterangan () pada mahluk … “ << endl;

}

}; Class Mamalia: public Mahluk{ public:

void keterangan(){ cout<<“Keterangan() pada Mamalia …” <<endl;

};

}

Class Sapi: public Mamalia{

public:

Void Main() {

Mamalia mamalia;

void keterangan(){ cout << “Keterangan () pada Sapi … “ << endl;

};

}

Sapi sapi_sumba; Mahluk *binatang; binatang=&mamalia; binatanginfo(); binatangketerangan(); binatang = &sapi_sumba; binatanginfo(); binatangketerangan();

};

Kelas Dasar Virtual Induk Anak 1 Anak 2 Gabungan Deklarasi kelas tersebut adalah
Kelas Dasar Virtual Induk Anak 1 Anak 2 Gabungan Deklarasi kelas tersebut adalah
Kelas Dasar Virtual Induk Anak 1 Anak 2 Gabungan Deklarasi kelas tersebut adalah
Kelas Dasar Virtual Induk Anak 1 Anak 2 Gabungan Deklarasi kelas tersebut adalah

Kelas Dasar Virtual

Induk

Kelas Dasar Virtual Induk Anak 1 Anak 2 Gabungan Deklarasi kelas tersebut adalah
Kelas Dasar Virtual Induk Anak 1 Anak 2 Gabungan Deklarasi kelas tersebut adalah

Anak 1

Anak 2

Kelas Dasar Virtual Induk Anak 1 Anak 2 Gabungan Deklarasi kelas tersebut adalah
Kelas Dasar Virtual Induk Anak 1 Anak 2 Gabungan Deklarasi kelas tersebut adalah

Gabungan

Deklarasi kelas tersebut adalah
Deklarasi kelas tersebut adalah
Class induk{ protected: char nama[25]; Tambahkan kata }; Class anak1: virtual public induk{ }; Tambahkan
Class induk{
protected:
char nama[25];
Tambahkan kata
};
Class anak1:
virtual
public induk{
};
Tambahkan kata
virtual
Class anak2:
public induk{
};
Class gabungan: public anak1, public anak2{
public:
void info_nama(){
cout <<“Nama Induk : “ << nama << endl;
}
}
Nama didapat dari anak1 dan anak2, karena itu menjadi salah
Nama didapat dari anak1
dan anak2, karena itu
menjadi salah
Destruktor Virtual  Fungsi yang dapat dijadikan virtual adalah:  Fungsi anggota  Destruktor 
Destruktor Virtual  Fungsi yang dapat dijadikan virtual adalah:  Fungsi anggota  Destruktor 
Destruktor Virtual  Fungsi yang dapat dijadikan virtual adalah:  Fungsi anggota  Destruktor 
Destruktor Virtual  Fungsi yang dapat dijadikan virtual adalah:  Fungsi anggota  Destruktor 

Destruktor Virtual

Fungsi yang dapat dijadikan virtual adalah:

Fungsi anggota

Destruktor

Destruktor virtual dipakai kalau kelas perlu

untuk menghapus object dari kelas turunan

berdasarkan pointer yang menunjuk ke kelas induk

Class trah_keluarga{ protected: char *nama_keluarga; public: trah_keluarga(char *nama){ nama= new
Class trah_keluarga{
protected:
char *nama_keluarga;
public:
trah_keluarga(char *nama){
nama= new char[strlen(nama)+1];
strcpy(nama_keluarga, nama);
}
virtual ~trah_keluarga(){
cout<<“Destruktor di trah keluarga ….” << endl;
delete [ ] nama_keluarga;
}
virtual void info() = 0;
};
Class keturunan: public trah_keluarga{ char *nama_depan; public: keturunan(char *nama_awal, char *nama_kel):
Class keturunan: public trah_keluarga{ char *nama_depan; public: keturunan(char *nama_awal, char *nama_kel):
Class keturunan: public trah_keluarga{ char *nama_depan; public: keturunan(char *nama_awal, char *nama_kel):
Class keturunan: public trah_keluarga{ char *nama_depan; public: keturunan(char *nama_awal, char *nama_kel):

Class keturunan: public trah_keluarga{ char *nama_depan;

public:

keturunan(char *nama_awal, char *nama_kel): trah_keluarga(nama_kel){ nama_depan= new char[strlen(nama_depan)+1]; strcpy(nama_depan, nama_awal);

}

~keturunan(){ cout<<“Destruktor di keturunan …” <<endl; delete [ ] nama_depan;

}

void info(){

cout<<“Nama depan : “ << nama_depan << endl;

}

}; Void main(){ trah_keluarga *anak_pertama= new keturunan(“Umar”, “Bakri”); anak_pertamainfo(); delete anak_pertama

};