Uncategorized

Tutorial Pemrograman Berorientasi Obyek dengan C++ : Multiple Inheritance (Studi Kasus)

Multiple inheritance (pewarisan berganda) adalah pengembangan dari pewarisan biasa dan pada prinsipnya sama dengan pewarisan biasa, hanya saja terdapat kekhususan karakateristik dalam mewariskan sifat suatu kelas ke kelas yang lain.

Sebuah kelas turunan dapat saja berasal dari tidak hanya dari satu induk saja, tapi lebih dari satu. Inilah yang disebut sebagai multiple inheritance. Untuk lebih jelasnya dapat digambarkan dalam ilustrasi berikut :

Gambar di atas menunjukkan adanya peristiwa multiple inheritance pada kelas R di mana kelas R ini mempunyai induk pada dua kelas yaitu kelas P dan kelas Q.

Berikut ini merupakan kode-kode program contoh implementasi dari penggunaan konsep pewarisan. Program berikut ditulis dengan bahasa pemrograman C++.

//-------------------------------------------------------
//	Program penerapan multiple inheritance
//	   menggunakan Turbo C++ versi 3.0
//-------------------------------------------------------
//		Filename : BU_KET.cpp
//-------------------------------------------------------
#include<iostream.h>
#include<string.h>
using namespace std;
class Buku
{
private:
char judul [35];
char pengarang [25];
long harga;
public:
Buku(char *judul, char *pengarang, long harga);
void info_buku();
};
class Disket
{
private:
char ukuran [15];
long harga;
public:
Disket(char *ukuran, long harga);
void info_disket();
};
class PaketBukuDisket : public Buku, public Disket
{
private:
long harga;
public:
PaketBukuDisket(char *judul, char *pengarang, long harga_buku, char *ukuran, long harga_disk);
void info_paket();
};
// Definisi metode-metode
Buku::Buku(char *judul, char *pengarang, long harga)
{
strcpy(Buku::judul, judul);
strcpy(Buku::pengarang, pengarang);
Buku::harga = harga;
}
void Buku::info_buku()
{	
cout<<"Judul buku	: "<< judul << endl;
cout<<"Pengarang	: "<< pengarang << endl;
cout<<"Harga buku	: "<< harga << endl;
}
Disket::Disket(char *ukuran, long harga)
{
strcpy(Disket::ukuran, ukuran);
Disket::harga = harga;
}
void Disket::info_disket()
{
cout<<"Ukuran disket 	: " << ukuran << endl;
cout<<"Harga disket 	: " << harga << endl;
}
PaketBukuDisket::PaketBukuDisket(
char *judul, char *pengarang, long harga_buku, char *ukuran, long harga_disket):
Buku(judul, pengarang, harga_buku),
Disket(ukuran, harga_disket)
{
harga = harga_buku + harga_disket;
}
void PaketBukuDisket::info_paket()
{
info_buku();
info_disket();
cout<<"Harga total 	: "<< harga << endl << endl;
}
//PROGRAM UTAMA
int main()
{
PaketBukuDisket cpp("C++", "Ardyriyanto", 25000, "3,5 inci", 12000);
cpp.info_paket();
return 0;
}

Program di atas merupakan program untuk menampilkan informasi tentang sebuah buku dan disketnya. Kelas-kelas yang terdapat dalam program di atas yaitu kelas Buku (kelas induk), kelas Disket (kelas induk), dan kelas PaketBukuDisket (kelas turunan). Kelas PaketBukuDisket merupakan kelas turunan yang mempunyai dua buah kelas induk yaitu kelas Buku (kelas induk) dan kelas Disket (kelas induk).

Untuk lebih jelasnya berikut merupakan uraian serta pembahasan tentang masing-masing baris program di atas yaitu sebagai berikut :

1. Semua baris yang diawali dengan dua buah tanda slash (//), akan dianggap sebagai baris komentar dan tidak akan berpengaruh pada hasil eksekusi program. Biasanya, baris komentar dipakai oleh Programmer untuk memberikan penjelasan atau keterangan tentang maksud program tersebut. Bagian dari program di atas yang menggunakan dua buah tanda slash (//) yaitu :

        //-------------------------------------------------------
//	Program penerapan multiple inheritance
//	   menggunakan Turbo C++ versi 3.0
//-------------------------------------------------------
//		Filename : BU_KET.cpp
//-------------------------------------------------------
...
//Definisi metode-metode
...
//PROGRAM UTAMA
...

2. Pernyataan yang diawali dengan tanda (#) merupakan pernyataan untuk menyertakan preprocessor. Pernyataan ini bukan untuk dieksekusi. Pernyataan seperti #include <iostream.h> berarti memerintahkan kompiler untuk menyertakan file header iostream.h. Dalam file header ini, terdapat beberapa fungsi standar yang dipakai dalam proses input dan output. Seperti misalnya perintah cout yang dipakai dalam program di atas merupakan bagian dari file header iostream.h.Selain itu, program di atas juga menggunakan preprocessor #include <string.h>. File header ini digunakan untuk melakukan manipulasi data bertipe karakter (char), misalnya fungsi strcpy. Bagian dari program di atas yang menggunakan dua tanda (#) yaitu :

…
# include <iostream.h>
# include <string.h>
…

3. Pernyataan seperti using namespace std; berfungsi untuk mendeklarasikan library  entity yang terdapat dalam file header iostream. Semua file dalam standar pustaka (library) dideklarasikan dengan std namespace, sehingga pernyataan using namespace std; harus disertakan dalam program yang mempunyai entity yang didefinisikan dalam iostream.

4. Pada kelas Buku (merupakan kelas induk), terdapat ungkapan-ungkapan sebagai berikut :

class Buku
{
private:
char judul [35];
char pengarang [25];
long harga;
public:
Buku(char *judul, char *pengarang, long harga);
void info_buku();
};

5. Pada kelas Buku, nama kelas ditulis dengan sintaks class Buku, yang menunjukkan bahwa Buku adalah nama suatu kelas. Tampak bahwa terdapat dua buah perubah akses (anggota kelas) yang digunakan pada kelas ini yaitu private dan public. Yang termasuk perubah akses private yaitu variabel judul (bertipe data karakter (char) dengan panjang maksimum 35 karakter), pengarang (bertipe data karakter (char) dengan panjang maksimum 25 karakter), dan harga (bertipe data long atau bilangan real dengan range yang lebih besar).Yang termasuk perubah akses public yaitu metode Buku () dan info_buku(). Prototype metode Buku ini berfungsi sebagai konstruktor dan memiliki argumen yang terdiri dari pointer judul dan pengarang yang masing-masing bertipe karakter, serta harga yang bertipe long. Prototype metode info_buku () menggunakan tipe data void, berarti bahwa hasil eksekusinya tidak bertipe (tanpa parameter) dan tidak memberikan nilai balik. Definisi atas metode-metode tersebut akan dipaparkan di bagian bawah.

5. Pada kelas Disket (merupakan kelas induk), terdapat ungkapan-ungkapan sebagai berikut :

class Disket
{
private:
char ukuran [15];
long harga;
public:
Disket(char *ukuran, long harga);
void info_disket();
};

Pada kelas Disket, nama kelas ditulis dengan sintaks class Disket, yang menunjukkan bahwa Disket adalah nama suatu kelas. Tampak bahwa terdapat dua buah perubah akses (anggota kelas) yang digunakan pada kelas ini yaitu private dan public. Yang termasuk perubah akses private yaitu variabel ukuran (bertipe data karakter (char) dengan panjang maksimum 15 karakter) dan harga (bertipe data long atau bilangan real dengan range yang lebih besar).Yang termasuk perubah akses public yaitu metode Disket () dan info_disket(). Prototype metode Disket ini berfungsi sebagai konstruktor dan memiliki argumen yang terdiri dari pointer ukuran dan harga yang bertipe long. Prototype metode info_disket () menggunakan tipe data void, berarti bahwa hasil eksekusinya tidak bertipe (tanpa parameter) dan tidak memberikan nilai balik. Definisi atas metode-metode tersebut akan dipaparkan di bagian bawah.

6. Pada kelas PaketBukuDisket (merupakan kelas turunan dari dua buah kelas induk yaitu kelas Buku dan Disket), terdapat ungkapan-ungkapan sebagai berikut :

class PaketBukuDisket : public Buku, public Disket
{
private:
long harga;
public:
PaketBukuDisket(char *judul, char *pengarang, long harga_buku, char *ukuran, long harga_disk);
void info_paket();
};

Pada kelas PaketBukuDisket, nama kelas ditulis dengan sintaks class PaketBukuDisket, yang menunjukkan bahwa PaketBukuDisket adalah nama suatu kelas. Tampak bahwa terdapat dua buah perubah akses (anggota kelas) yang digunakan pada kelas ini yaitu private dan public. Yang termasuk perubah akses private yaitu harga (bertipe data long atau bilangan real dengan range yang lebih besar).Yang termasuk perubah akses public yaitu metode PaketBukuDisket () dan info_paket(). Prototype metode Disket ini berfungsi sebagai konstruktor dan memiliki argumen yang terdiri dari pointer ukuran dan harga yang bertipe long. Prototype metode info_paket () menggunakan tipe data void, berarti bahwa hasil eksekusinya tidak bertipe (tanpa parameter) dan tidak memberikan nilai balik. Definisi atas metode-metode tersebut akan dipaparkan di bagian bawah.

7. Berikut ini merupakan definisi metode-metode pada kelas Buku :

Buku::Buku(char *judul, char *pengarang, long harga)
{
strcpy(Buku::judul, judul);
strcpy(Buku::pengarang, pengarang);
Buku::harga = harga;
}
void Buku::info_buku()
{	
cout<<"Judul buku	: "<< judul << endl;
cout<<"Pengarang	: "<< pengarang << endl;
cout<<"Harga buku	: "<< harga << endl;
}

Pernyataan seperti yang digunakan untuk mendefinisikan nama metode Buku yaitu  Buku::Buku(char *judul, char *pengarang, long harga) artinya pada metode ini akan digunakan operasi yang memuat variabel judul (pointer, karena bertipe char), variabel pengarang (pointer, karena bertipe char), dan variabel usia yang bertipe long (bilangan real dengan range lebih besar). Kemudian pernyataan  strcpy(Orang::nama, nama); merupakan suatu perintah untuk menyalin isi array judul ke variabel judul yang terdapat  dalam obyek pada kelas Buku. Pernyataan  strcpy(Buku::pengarang, pengarang); berfungsi untuk  menyalin isi array pengarang ke variabel pengarang yang terdapat dalam obyek pada kelas Buku. Sedangkan pernyataan Buku::harga = harga berfungsi untuk mengisi harga yang terdapat dalam obyek pada kelas Buku dengan isi dari variabel harga buku.

Metode void Buku::info_buku() akan menampilkan kalimat-kalimat : “Judul buku:”; “Pengarang:”; dan “Harga buku:”. Isi dari metode ini merupakan info dari buku (obyek) yang berasal dari kelas Buku yang mempunyai atribut judul, pengarang, dan harga. Jadi, data yang diinputkan akan dianggap sebagai variabel judul (untuk data yang diinputkan pada “Judul buku:”), variabel pengarang (untuk data yang diinputkan pada “Pengarang:”), dan variabel harga (untuk data yang diinputkan pada “Harga buku:”). Sedangkan endl berfungsi sebagai penanda akhir dari baris.

8. Berikut ini merupakan definisi metode-metode pada kelas Disket :

Disket::Disket(char *ukuran, long harga)
{
strcpy(Disket::ukuran, ukuran);
Disket::harga = harga;
}
void Disket::info_disket()
{
cout<<"Ukuran disket 	: " << ukuran << endl;
cout<<"Harga disket 	: " << harga << endl;
}

Pernyataan seperti yang digunakan untuk mendefinisikan nama metode Disket yaitu  Disket::Disket(char *ukuran, long harga) artinya pada metode ini akan digunakan operasi yang memuat variabel ukuran (pointer, karena bertipe char) dan variabel harga yang bertipe long (bilangan real dengan range lebih besar). Kemudian pernyataan  strcpy(Disket::ukuran, ukuran); merupakan suatu perintah untuk menyalin isi array ukuran ke variabel ukuran yang terdapat  dalam obyek pada kelas Disket. Sedangkan pernyataan Disket::harga = harga; berfungsi untuk mengisi harga yang terdapat dalam obyek pada kelas Disket dengan isi dari variabel harga Disket.

Metode void Disket::info_disket() akan menampilkan kalimat-kalimat : “ukuran disket:” dan “Harga disket:”. Isi dari metode ini merupakan info dari disket (obyek) yang berasal dari kelas Disket yang mempunyai atribut ukuran dan harga. Jadi, data yang diinputkan akan dianggap sebagai variabel ukuran (untuk data yang diinputkan pada “Ukuran disket:”), dan variabel harga (untuk data yang diinputkan pada “Harga disket:”). Sedangkan endl berfungsi sebagai penanda akhir dari baris.

9. Berikut ini merupakan definisi metode-metode pada kelas PaketBukuDisket :

PaketBukuDisket::PaketBukuDisket(char *judul, char *pengarang, long harga_buku, char *ukuran, long harga_disket):
Buku(judul, pengarang, harga_buku),
Disket(ukuran, harga_disket)
{
harga = harga_buku + harga_disket;
}
void PaketBukuDisket::info_paket()
{
info_buku();
info_disket();
cout<<"Harga total 	: "<< harga << endl << endl;
}

Pernyataan seperti yang digunakan untuk mendefinisikan nama metode PaketBukuDisket yaitu  PaketBukuDisket::PaketBukuDisket(char *judul, char *pengarang, long harga_buku, char *ukuran, long harga_disket): artinya pada metode ini akan memuat data judul, pengarang, harga_buku, ukuran, dan harga_disket. Metode ini menggunakan akses public dari kelas Buku maupun Disket Jadi fungsi public dari kelas Buku dan Disket otomatis akan menjadi fungsi dari kelas turunannya ini.  Metode ini akan melakukan perhitungan harga total sama dengan harga buku ditambah dengan harga disketnya yang ditunjukkan dengan pernyataan harga = harga_buku + harga_disket;.

Metode void PaketBukuDisket::info_paket() akan menampilkan kalimat ”Harga total” (yang akan diisi dengan nilai dari variabel harga yang telah dihitung pada metode sebelumnya) ditambah dengan fungsi-fungsi pada metode info_buku() dan info_disket(). Jadi metode ini berfungsi untuk info dari obyek yang akan ditampilkan dan berasal dari kelas PaketBukuDisket yang mempunyai atribut judul buku, pengarang, harga buku (dari kelas Buku); ukuran disket, harga disket (dari kelas Disket); serta harga total. Hal ini menunjukkan bahwa kelas PaketBukuDisket merupakan bentuk multiple inheritance (pewarisan berganda) yang diturunkan dari dua kelas induk yaitu kelas Buku dan Disket. Sedangkan endl berfungsi sebagai penanda akhir dari baris.

10. Bagian program utama dalam keseluruhan program di atas yaitu sebagai berikut :

int main()
{
PaketBukuDisket cpp("C++", "Ardyriyanto", 25000, "3,5 inci", 12000);
cpp.info_paket();
return 0;
}

Penulisan listing program untuk bagian program utama selalu diawali dengan fungsi int main (). Fungsi dari program utama di atas yaitu untuk menentukan prosedur dan langkah eksekusi terhadap masing-masing kelas yang telah dibuat. Pada program utama di atas ternyata prosedur yang digunakan untuk menampilkan output ke layar yaitu tanpa meminta input dari user, artinya obyek yang dimasukkan sudah ditentukan terlebih dahulu dalam program utama. Tampak bahwa program utama tersebut akan menampilkan obyek-obyek yang memuat metode-metode dalam kelas PaketBukuDisket yaitu :

C++                       →  variabel judul dari kelas Buku

Ardyrianto   →  variabel pengarang dari kelas Buku

25000                   →  variabel harga dari kelas Buku

3,5 inchi          →  variabel ukuran dari kelas Disket

12000                   →  variabel harga dari kelas Disket

Data-data di atas adalah data pada obyek yang diberi nama cpp. Setelah data diinputkan, digunakan fungsi dari info_paket(), sehingga akan memberikan output sesuai dengan hasil eksekusi. Pernyataan return 0; berfungsi untuk menghentikan proses eksekusi tanpa memberi nilai balik.

11. Tanda kurung kurawal ({…}) digunakan untuk menandai bagian suatu isi kelas, bagian isi metode-metode di dalam kelas (behaviour), serta bagian isi program utama.

12.  Tanda titik koma (;) digunakan untuk menandai akhir penulisan data dan fungsi dalam program. Tanda titik koma tidak digunakan untuk mengakhiri nama kelas, nama metode, nama perubah akses, serta inisialisasi program utama.

Hasil eksekusi terhadap program di atas yaitu :

praktikum@komputer07:~$ g++ BU_KET.cpp
In file included from /usr/lib/gcc/i486-linux-	gnu/4.0.3/../../../../include/c++/4.0.3/backward/iostream.h:31,
from BU_KET.cpp:8:
/usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/backward/backward_warning.h:32:2: 	warning: #warning This file includes at least one deprecated or antiquated header. Please 	consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples 	include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> 	instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
praktikum@komputer07:~$ ./a.out
Judul buku      	: C++
Pengarang       	: Ardyriyanto
Harga buku      	: 25000
Ukuran disket   	: 3,5 inci
Harga disket    	: 12000
Harga total     	: 37000