Virtual Function dan VTable di C++

Virtual Function dan VTable di C++

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:

  1. Objek menggunakan VPtr untuk menunjuk ke VTable kelasnya.
  2. Compiler mencari alamat fungsi yang sesuai di VTable.
  3. 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 objek derived.
  • VPtr menunjuk ke VTable Derived, di mana alamat fungsi Derived::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

  1. Polimorfisme Dinamis: Memungkinkan perilaku dinamis berdasarkan objek aktual.
  2. Reusability: Mempermudah penggunaan ulang kode dengan konsep hierarki kelas.
  3. Abstraksi: Digunakan dalam kelas abstrak untuk memaksa implementasi ulang fungsi di kelas turunan.

Catatan Penting tentang Virtual Function

  1. Virtual function hanya bekerja dengan pointer atau referensi kelas induk.
  2. Jika fungsi tidak override di kelas turunan, fungsi di kelas induk yang akan dipanggil.
  3. 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

Your email address will not be published. Required fields are marked *