Virtual Function adalah fungsi anggota dari suatu kelas yang dapat dioverride oleh kelas turunan, memungkinkan dynamic dispatch (pemanggilan fungsi yang sesuai dengan tipe objek saat runtime). Untuk mengimplementasikan fungsi virtual, C++ menggunakan struktur yang disebut VTable (Virtual Table) dan VPtr (Virtual Pointer).
Apa itu Virtual Function?
- Deklarasi: Virtual function dideklarasikan dengan kata kunci
virtual
dalam kelas induk. - Tujuan: Memungkinkan polymorphism sehingga fungsi yang dipanggil ditentukan berdasarkan objek aktual, bukan tipe pointer atau referensi.
- Overriding: Kelas turunan dapat mendefinisikan ulang (override) fungsi ini.
- Pointer atau Referensi: Virtual function hanya berlaku saat objek diakses melalui pointer atau referensi kelas induk.
Contoh Virtual Function
#include <iostream>
using namespace std;
class Hewan {
public:
virtual void suara() {
cout << "Hewan mengeluarkan suara." << endl;
}
};
class Anjing : public Hewan {
public:
void suara() override {
cout << "Anjing menggonggong." << endl;
}
};
class Kucing : public Hewan {
public:
void suara() override {
cout << "Kucing mengeong." << endl;
}
};
int main() {
Hewan* hewan;
Anjing anjing;
Kucing kucing;
hewan = &anjing;
hewan->suara(); // Memanggil versi Anjing
hewan = &kucing;
hewan->suara(); // Memanggil versi Kucing
return 0;
}
Output:
Anjing menggonggong.
Kucing mengeong.
Bagaimana VTable dan VPtr Bekerja
1. VTable (Virtual Table):
- Definisi: Sebuah tabel yang disimpan secara internal oleh compiler untuk setiap kelas yang memiliki fungsi virtual.
- Isi: Menyimpan alamat fungsi virtual dari kelas tersebut, atau kelas turunannya jika fungsi tersebut dioverride.
2. VPtr (Virtual Pointer):
- Definisi: Pointer yang disimpan dalam setiap objek yang menunjuk ke VTable kelasnya.
- Fungsi: Saat fungsi virtual dipanggil, compiler menggunakan VPtr untuk mencari fungsi yang sesuai di VTable.
Proses Pemanggilan Virtual Function:
- Objek menggunakan VPtr untuk menunjuk ke VTable kelasnya.
- Compiler mencari alamat fungsi yang sesuai di VTable.
- Fungsi dipanggil berdasarkan alamat yang ditemukan.
Contoh VTable dan Virtual Dispatch
Kode:
#include <iostream>
using namespace std;
class Base {
public:
virtual void show() {
cout << "Base class function." << endl;
}
};
class Derived : public Base {
public:
void show() override {
cout << "Derived class function." << endl;
}
};
int main() {
Base* basePtr; // Pointer ke kelas Base
Derived derived; // Objek kelas Derived
basePtr = &derived; // Base pointer menunjuk ke objek Derived
basePtr->show(); // Memanggil versi Derived
return 0;
}
Output:
Derived class function.
Penjelasan:
- Saat
basePtr->show()
dipanggil, compiler memeriksa VPtr dalam objekderived
. - VPtr menunjuk ke VTable
Derived
, di mana alamat fungsiDerived::show
ditemukan. - Fungsi
Derived::show
dieksekusi.
Virtual Destructor
Jika sebuah kelas memiliki virtual function, destructornya juga sebaiknya dideklarasikan sebagai virtual. Hal ini mencegah resource leaks saat objek dihapus melalui pointer kelas induk.
Contoh Virtual Destructor:
#include <iostream>
using namespace std;
class Base {
public:
virtual ~Base() {
cout << "Destructor Base dipanggil." << endl;
}
};
class Derived : public Base {
public:
~Derived() {
cout << "Destructor Derived dipanggil." << endl;
}
};
int main() {
Base* basePtr = new Derived();
delete basePtr; // Memanggil destructor Derived, lalu Base
return 0;
}
Output:
Destructor Derived dipanggil.
Destructor Base dipanggil.
Keuntungan Virtual Function
- Polimorfisme Dinamis: Memungkinkan perilaku dinamis berdasarkan objek aktual.
- Reusability: Mempermudah penggunaan ulang kode dengan konsep hierarki kelas.
- Abstraksi: Digunakan dalam kelas abstrak untuk memaksa implementasi ulang fungsi di kelas turunan.
Catatan Penting tentang Virtual Function
- Virtual function hanya bekerja dengan pointer atau referensi kelas induk.
- Jika fungsi tidak override di kelas turunan, fungsi di kelas induk yang akan dipanggil.
- Menambahkan fungsi virtual memiliki overhead, seperti memori untuk VTable dan VPtr, serta waktu untuk pencarian di VTable.
Jika Anda ingin penjelasan lebih dalam, seperti implementasi VTable di bawah level compiler atau penggunaan virtual function dengan konteks khusus, beri tahu saya! 😊
Leave a Reply