Berbeda dengan overloading. Kalo overloading, kita boleh menuliskan method yang sama namun dengan jumlah parameter yang berbeda dan nilai kembalian harus sama. Nah, kalau overriding konsepnya sama dengan overloading yaitu menulis kembali method. Namun, caranya overriding menulis kembali method sama persis. Sama mulai dari nama method dan isinya dan mengimplementasi kembali di sub classnya. Overriding dipakai saat kita menggunakan method yang sama tapi berbeda implementasinya. Jadi overriding method mempunyai nama method yang sama, jumlah parameter dan tipe parameter serta nilai kembalian (return) method yang di override. Jika method memiliki modifier akses public, method overridenya juga harus public.
Contoh:
class Kendaraan {
..............
public String getJenis() {
System.out.println(“Harga BBM turun”);
}
}
class Motor extends Kendaraan {
..............
public String getJenis() {
System.out.println(“Harga BBM premium 4000 rupiah”);
}
}
NB:
• class motor mengextends class kendaraan
• class motor melakukan override method di kendaraan namun berbeda implementasi
Kesimpulan:
• Override method merupakan method yang sama persis dengan method yang sudah ada di super kelasnya, biasanya perbedaannya adalah pada implementasi (program body)
• Overidding tidak bisa dilakukan dalam kelas itu sendiri
• Jadi Overidding kerat kaitannya dengan inheritance (pewarisan)
Contoh lain:
class Lingkaran {
double r;
Lingkaran(double r) {
this.r = r;
}
double Luas() {
return Math.PI*this.r*this.r;
}
double Luas(double r) {
this.r = r;
return Math.PI*this.r*this.r;
}
}
class Tabung extends Lingkaran {
double h;
Tabung() {
//konstruktor kelas turunan, ada super() dan diisi nilai awal
super(0);
}
double Luas(double r) {
//overriding (method and parameter sama)
this.r = r;
return Math.PI * this.r * this.r * this.h;
}
}
NB:
• Class lingkaran melakukan overloading method Luas (beda signature)
• Class tabung mengextends class lingkaran
• Class tabung meng-override method Luas hasil dari overload. Jadi kita juga biosa mengoverride method hasil overloading juga
Destructor
Destructor adalah anggota class (member function) yang berfungsi melepas memori pada
saat suatu obyek sudah tidak diperlukan lagi. Fungsi destructor kebalikan constructor.
Destructor tidak mempunyai atau memerlukan argumen. Destructor juga tidak
mengembalikan nilai apapun (tidak mempunyai return type). Seperti halnya constructor,
compiler dapat menambahkan sebuah destructor jika sebuah class tidak mempunyai
destructor.
virtual Destructor
Sebuah destructor dapat berupa fungsi virtual. Hal ini menjadi keharusan jika class B,
•merupakan base class.
•class D yang menggunakan B sebagai base class mempunyai anggota berupa
data dengan alokasi memori dinamik (pointer).
class B
{
public:
B();
~B();
};
class D : public B
{
mfachrz@gmail.com
Copyright@PIK-Unsri Maret 2006
34
public:
D() : p(new char[256]) {}
~D()
{
delete[] p;
}
…
private:
char *p;
};
Pada contoh tersebut destructor base class B bukan fungsi virtual. Dalam C++ umumnya
obyek class D digunakan secara polimorphic dengan membentuk obyek class D (derived
class) dan menyimpan alamat obyek tersebut dalam pointer class B (base class) seperti
pada contoh berikut ini,
void main(void)
{
B *pB=new D();
delete pB;
}
Dalam standar C++ menghapus obyek D (derived class) melalui pointer class B (base
class) sedangkan destructor base class non-virtual mempunyai efek yang tidak menentu
(undefined behaviour). Apabila standard C++ tidak menetapkan apa yang seharusnya
berlaku, maka terserah kepada pembuat compiler menentukan perilaku program pada
kondisi semacam ini. Umumnya pembuat compiler mengambil langkah untuk tidak
memanggil destructor class D (derived class). Dengan demikian, pada saat menjalankan
perintah delete, destructor class D tidak dieksekusi karena destructor base class B
mfachrz@gmail.com
Copyright@PIK-Unsri Maret 2006
35
nonvirtual. Akibatnya lokasi memori dinamik yang digunakan class D tidak pernah
dilepas. Hal ini adalah contoh lain terjadinya pemborosan memori (memory leak) oleh
suatu program. Jalan keluarnya adalah membuat destructor base class B virtual,
class B
{
public:
B();
virtual ~B();
}
Tidak seperti destructor, tidak ada virtual constructor atau virtual copy constructor. Pada
saat membentuk obyek, tipe obyek harus diketahui terlebih dahulu, apakah membentuk
obyek class A, B, C dsb. Tidak ada aspek bahasa C++ untuk mewujudkan virtual
constructor secara langsung, menempatkan virtual pada deklarasi constructor
merupakan kesalahan yang terdeteksi pada proses kompilasi. Efek virtual constructor
bukan tidak mungkin dicapai, C++ memungkinkan membuat idiom virtual constructor
yang bertumpu pada fungsi virtual dalam kaitannya dengan hubungan antara sebuah
class dengan base classnya.
Ringkasan
Sejauh ini pembahasan artikel masih belum menyentuh aspek praktis pemrograman,
namun demikian dalam menterjemahkan suatu desain maupun memahami program
yang ditulis orang lain sangatlah penting mengetahui aturan dasar sesuai standarisasi
C++.
Teori Destructor
Constructor dipanggil Ada space di memori yang terpakai Bebaskan memori setelah selesai Destructor
Fungsi & sifat destructor
• Fungsi : membebaskan memori yang digunakan variabel dinamis.
• Sifat :
otomatis dijalankan pada saat objek dilenyapkan.
tdk terdapat argumen (parameter)/void.
nama destructor = ~nama class
Contoh :
// example on constructors and destructors
#include
class CRectangle {
int *width, *height;
public:
CRectangle (int,int);
~CRectangle ();
int area (void) {return (*width * *height);}
};
CRectangle::CRectangle (int a, int b) {
width = new int;
height = new int;
*width = a;
*height = b;
}
CRectangle::~CRectangle () {
delete width;
delete height;
}
int main () {
CRectangle rect (3,4), rectb (5,6);
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}
Keterangan :
Program diatas menggunakan constructor untuk memberi nilai variable height dan width.
Constructornya adalah sbb:
CRectangle::CRectangle (int a, int b) {
width = new int;
height = new int;
*width = a;
*height = b;
}
Karena nantinya space memori yang ditempati height dan width akan dibebaskan setelah selesai maka keduanya dideklarasikan sebagai dynamic variable (pointer). Hanya dynamic variable yang dapat dihilangkan dari memori. Pembebasan memori menggunakan destructor sbb :
CRectangle::~CRectangle () {
delete width;
delete height;
}