Polymorphism dalam C++

Helo semua, pemrogram beraspirasi! Hari ini, kita akan menyusuri perjalanan yang menarik ke atas dunia polymorphism di C++. Jangan khawatir jika perkataan ini terdengar menakutkan – pada akhir pelajaran ini, kamu akan merasa selesa dengan polymorphism seperti kamu dengan rakit penyuka kamu!

C++ Polymorphism

Apa itu Polymorphism?

Sebelum kita melompat ke dalam kod, mari kita faham apa yang sebenarnya dimaksudkan dengan polymorphism. Perkataan ini berasal dari bahasa Yunani: 'poly' yang berarti banyak, dan 'morph' yang berarti bentuk. Dalam pemrograman, polymorphism membolehkan objek jenis berbeza untuk diperlakukan sebagai objek jenis dasar umum. Ia seperti memiliki remote universal yang boleh mengawal peranti berbeza – cukup keren, kan?

Analogy Dunia Sebenar

Bayangkanlah kamu di atas sebuah zoo. Kamu lihat haiwan berbeza – singa, gajah, penguin. Mereka semua haiwan, tetapi mereka berkelakuan berbeza. Apabila tiba masa untuk penyediannya, penyelamat tidak perlu tahu jenis haiwan yang betul bagi setiap satu mereka. Mereka hanya perlu untuk memanggil arahan umum "makan", dan setiap haiwan akan merespon dengan cara mereka sendiri. Itulah polymorphism dalam aksi!

Fungsi Virtual

Sekarang, mari kita masuk ke atas detail polymorphism di C++, dimulai dengan fungsi virtual.

Apa itu Fungsi Virtual?

Fungsi virtual adalah fungsi khas di C++ yang membolehkan program untuk memutuskan fungsi mana untuk dipanggil pada saat waktu pelaksanaan berdasarkan jenis objek yang diperujuk, bukannya jenis penunjuk atau rujukan yang digunakan.

Berikut adalah contoh ringkas:

#include <iostream>
using namespace std;

class Animal {
public:
virtual void makeSound() {
cout << "Haiwan itu membuat suara" << endl;
}
};

class Dog : public Animal {
public:
void makeSound() override {
cout << "Anjing itu gong: Woof!" << endl;
}
};

class Cat : public Animal {
public:
void makeSound() override {
cout << "Kucing itu miang: Meow!" << endl;
}
};

int main() {
Animal* animal1 = new Dog();
Animal* animal2 = new Cat();

animal1->makeSound();  // Output: Anjing itu gong: Woof!
animal2->makeSound();  // Output: Kucing itu miang: Meow!

delete animal1;
delete animal2;
return 0;
}

Mari kita pecah ini:

  1. Kita ada kelas dasar Animal dengan fungsi virtual makeSound().
  2. Kita membuat dua kelas turunan, Dog dan Cat, masing-masing mengatasi fungsi makeSound().
  3. Di main(), kita membuat penunjuk jenis Animal* tetapi mengumpulkan mereka objek Dog dan Cat.
  4. Apabila kita memanggil makeSound(), program tahu untuk memanggil versi yang betul berdasarkan jenis objek sebenar, bukannya jenis penunjuk.

Ini adalah sihir fungsi virtual dan polymorphism!

Kata Kunci 'virtual'

Kata kunci virtual adalah kritikal di sini. Ia memberitahu pengkompiler bahwa fungsi ini mungkin diatasi dalam kelas turunan. Tanpa itu, program akan selalu memanggil versi kelas dasar bagi fungsi tersebut.

Fungsi Virtual Bersih

Sekarang, mari kita naik taraf dan bercakap tentang fungsi virtual bersih.

Apa itu Fungsi Virtual Bersih?

Fungsi virtual bersih adalah fungsi virtual yang tidak ada implementasi di atas kelas dasar. Ia diisytiharkan dengan menetapkan 0 kepada pengisytiharan fungsi.

Berikut adalah contoh:

#include <iostream>
using namespace std;

class Shape {
public:
virtual double area() = 0;  // Fungsi virtual bersih
};

class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
double area() override {
return 3.14159 * radius * radius;
}
};

class Rectangle : public Shape {
private:
double length, width;
public:
Rectangle(double l, double w) : length(l), width(w) {}
double area() override {
return length * width;
}
};

int main() {
Shape* shape1 = new Circle(5);
Shape* shape2 = new Rectangle(4, 5);

cout << "Luas lingkaran: " << shape1->area() << endl;
cout << "Luas persegi panjang: " << shape2->area() << endl;

delete shape1;
delete shape2;
return 0;
}

Dalam contoh ini:

  1. Shape adalah kelas dasar abstrak dengan fungsi virtual bersih area().
  2. Circle dan Rectangle adalah kelas konkret yang mewarisi dari Shape dan menyediakan implementasi mereka sendiri bagi area().
  3. Kita boleh membuat penunjuk Shape dan mengumpulkan mereka objek Circle dan Rectangle.
  4. Apabila kita memanggil area(), versi yang betul dipanggil berdasarkan jenis objek sebenar.

Kelas Abstrak

Kelas yang memiliki setidaknya satu fungsi virtual bersih disebut kelas abstrak. Anda tidak boleh membuat objek bagi kelas abstrak, tetapi anda boleh menggunakan penunjuk dan rujukan ke jenis kelas abstrak.

Mengapa Gunakan Polymorphism?

  1. Kemudahan: Ia membolehkan kamu untuk menulis kod yang boleh bekerja dengan objek jenis berbeza.
  2. Kemampuan diperluas: Kamu boleh menambah kelas turunan baru tanpa mengubah kod sedia ada.
  3. Kesederhanaan: Ia boleh menyederhanakan kod dengan membolehkan kamu untuk menganggap objek berbeza secara seragam.

Metode Umum dalam Polymorphism

Berikut adalah rakam metode yang umum digunakan dalam polymorphism di C++:

Metode Keterangan
virtual Kata kunci yang digunakan untuk mendeklarasikan fungsi virtual di atas kelas dasar
override Kata kunci yang digunakan di atas kelas turunan untuk menunjukkan bahwa fungsi tersebut mengatasi fungsi kelas dasar
= 0 Digunakan untuk mendeklarasikan fungsi virtual bersih
dynamic_cast Digunakan untuk pengurangan yang selamat dalam hieraki kelas polymorphism
typeid Digunakan untuk mendapatkan maklumat jenis pada saat waktu pelaksanaan

Penutup

Polymorphism adalah fitur yang kuat di C++ yang membolehkan untuk kod yang fleksibel dan dapat diperluas. Dengan menggunakan fungsi virtual dan fungsi virtual bersih, kamu boleh membuat hirarki kelas yang boleh digunakan secara bergantian, membawa kepada kod yang lebih modular dan dapat dipelihara.

Ingat, seperti mempelajari sebarang keterampilan baru, menguasai polymorphism memerlukan latihan. Jangan khuatir jika ia tidak kena segera – teruskan untuk mengkod, teruskan untuk eksperimen, dan segera kamu akan polymorphing seperti pro!

Credits: Image by storyset