Polimorfisme di C++ Panduan Lengkap

Polimorfisme di C++: Panduan Lengkap

Polimorfisme adalah salah satu pilar utama dalam Pemrograman Berorientasi Objek (OOP). Polimorfisme memungkinkan suatu fungsi atau objek berperilaku berbeda tergantung pada konteksnya. Di C++, polimorfisme dapat dibagi menjadi dua jenis utama:

  1. Polimorfisme Kompilasi (Compile-time Polymorphism)
    • Melibatkan overloading (fungsi dan operator).
  2. Polimorfisme Run-time (Run-time Polymorphism)
    • Melibatkan inheritance dan pointer atau referensi dengan fungsi virtual.

1. Polimorfisme Kompilasi

A. Function Overloading

Function overloading memungkinkan Anda mendefinisikan beberapa fungsi dengan nama yang sama tetapi dengan parameter yang berbeda.

Contoh:
#include <iostream>
using namespace std;

class Kalkulator {
public:
    // Overloading fungsi tambah
    int tambah(int a, int b) {
        return a + b;
    }

    double tambah(double a, double b) {
        return a + b;
    }

    int tambah(int a, int b, int c) {
        return a + b + c;
    }
};

int main() {
    Kalkulator k;
    cout << "Tambah (int): " << k.tambah(5, 3) << endl;
    cout << "Tambah (double): " << k.tambah(2.5, 3.5) << endl;
    cout << "Tambah (3 argumen): " << k.tambah(1, 2, 3) << endl;

    return 0;
}

Output:

Tambah (int): 8
Tambah (double): 6
Tambah (3 argumen): 6

B. Operator Overloading

Operator overloading memungkinkan operator seperti +, -, atau * memiliki perilaku khusus untuk objek tertentu.

Contoh:
#include <iostream>
using namespace std;

class Kompleks {
public:
    double real, imag;

    Kompleks(double r = 0, double i = 0) : real(r), imag(i) {}

    // Overloading operator +
    Kompleks operator+(const Kompleks& obj) {
        return Kompleks(real + obj.real, imag + obj.imag);
    }

    void tampilkan() {
        cout << real << " + " << imag << "i" << endl;
    }
};

int main() {
    Kompleks a(1.5, 2.5), b(2.0, 3.0);
    Kompleks c = a + b;  // Memanggil operator+
    c.tampilkan();

    return 0;
}

Output:

3.5 + 5.5i

2. Polimorfisme Run-time

A. Virtual Functions (Fungsi Virtual)

Fungsi virtual memungkinkan suatu fungsi yang dideklarasikan dalam kelas induk dapat dioverride oleh kelas turunan.

Contoh:
#include <iostream>
using namespace std;

class Hewan {
public:
    virtual void suara() {  // Fungsi virtual
        cout << "Hewan mengeluarkan suara." << endl;
    }
};

class Anjing : public Hewan {
public:
    void suara() override {  // Override fungsi suara
        cout << "Anjing menggonggong." << endl;
    }
};

class Kucing : public Hewan {
public:
    void suara() override {
        cout << "Kucing mengeong." << endl;
    }
};

int main() {
    Hewan* hewan;  // Pointer ke kelas induk
    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.

B. Pure Virtual Functions dan Abstract Class

Pure virtual function digunakan untuk mendefinisikan kelas abstrak yang tidak dapat diinstansiasi.

Contoh:
#include <iostream>
using namespace std;

class Bentuk {
public:
    virtual void gambar() = 0;  // Pure virtual function
};

class Lingkaran : public Bentuk {
public:
    void gambar() override {
        cout << "Menggambar Lingkaran." << endl;
    }
};

class Persegi : public Bentuk {
public:
    void gambar() override {
        cout << "Menggambar Persegi." << endl;
    }
};

int main() {
    Bentuk* bentuk;
    Lingkaran lingkaran;
    Persegi persegi;

    bentuk = &lingkaran;
    bentuk->gambar();  // Memanggil versi Lingkaran

    bentuk = &persegi;
    bentuk->gambar();  // Memanggil versi Persegi

    return 0;
}

Output:

Menggambar Lingkaran.
Menggambar Persegi.

Kesimpulan

  1. Polimorfisme Kompilasi:
    • Function overloading.
    • Operator overloading.
  2. Polimorfisme Run-time:
    • Menggunakan inheritance dan fungsi virtual.
    • Dapat memanfaatkan pure virtual function untuk membuat kelas abstrak.

Polimorfisme membantu membuat kode lebih modular, fleksibel, dan dapat diperluas. Jika ada aspek yang ingin Anda pelajari lebih lanjut, seperti implementasi polimorfisme dengan template atau studi kasus, beri tahu saya! 😊

Leave a Reply

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