Dynamic Binding



Dalam C++, dynamic binding terjadi ketika sebuah virtual function dipanggil menggunakan sebuah reference atau sebuah pointer ke sebuah base class. Faktanya, reference atau pointer tersebut mungking merujuk ke base class yang lain atau derived-class object yang merupakan inti untuk dynamic binding. Pemanggilan virtual functions dipanggil melalui sebuah reference atau pointer yang di jalankan saat program berjalan (run time). Fungsi yang dipanggil adalah salah satu fungsi yang di defenisikan oleh tipe obyek yang sebenarnya kemana reference atau pointer itu merujuk.

Dynamic binding membolehkan pengguna menulis program yang menggunakan obyek dari bermacam tipe yang ada dalam hierarki inheritance tanpa memperdulikan tipe spesifik obyek. Program yang menggunakan classes perlu untuk tidak bingung antara fungsi yang didefenisikan pada base class ataupun pada derived class-nya.

Bayangkan sebuah hirarki class yang disebut Shape berfungsi sebagai dasar untuk kelas lainnya kelas (Triangle dan Square):

class Shape
{
public:
void virtual Draw() {} //dummy implementation
//..
};
class Square
{
public:
void Draw(); //overriding Shape::Draw
}
class Triangle
{
public:
void Draw(); //overriding Shape::Draw
}

Draw () adalah sebuah fungsi virtual dalam Shape. Fungsi Draw() dideklarasikan secara virtual dalam base class untuk mengaktifkan derived class untuk mengabaikan dan menyediakan implementasi sendiri. Keindahan dalam polymorphism adalah sebuah pointer atau referensi ke Shape sebenarnya boleh mengarah ke obyek dari Square atau Triangle:

void func(const Shape* s)
{
s->Draw()
}
int main()
{
Shape *p1= new Triangle;
Shape *p2 = new Square;
func(p1);
func(p2);
}

C++ membedakan antara statis dan dinamis obyek. Jenis statis ditentukan pada waktu kompilasi. Ini adalah jenis yang ditetapkan dalam Deklarasi. Sebagai contoh, kedua jenis statis p1 dan p2 adalah “Shape *”. Namun, jenis dinamis ini pointer ditentukan oleh jenis objek yang mereka rujuk: “Triangle *” dan “Square *”, masing-masing. Ketika func () memanggil fungsi anggota Draw () , C++ resolve yang dinamis jenis s dan memastikan bahwa sesuai versi Draw () adalah invoked. Perhatikan bagaimana kuat dinamis mengikat : Anda dapat berasal dari kelas-kelas tambahan yang akan melakukan override kepada fungsi Draw () bahkan setelah func () dikompilasi. Ketika func () invokes Draw () , C++ masih akan menyelesaikan panggilan dinamis sesuai dengan jenis s.