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!
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:
- Kita ada kelas dasar
Animal
dengan fungsi virtualmakeSound()
. - Kita membuat dua kelas turunan,
Dog
danCat
, masing-masing mengatasi fungsimakeSound()
. - Di
main()
, kita membuat penunjuk jenisAnimal*
tetapi mengumpulkan mereka objekDog
danCat
. - 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:
-
Shape
adalah kelas dasar abstrak dengan fungsi virtual bersiharea()
. -
Circle
danRectangle
adalah kelas konkret yang mewarisi dariShape
dan menyediakan implementasi mereka sendiri bagiarea()
. - Kita boleh membuat penunjuk
Shape
dan mengumpulkan mereka objekCircle
danRectangle
. - 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?
- Kemudahan: Ia membolehkan kamu untuk menulis kod yang boleh bekerja dengan objek jenis berbeza.
- Kemampuan diperluas: Kamu boleh menambah kelas turunan baru tanpa mengubah kod sedia ada.
- 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