Polimorfisme di C++
Halo para pemrogram berbakat! Hari ini, kita akan melakukan perjalanan yang menarik ke dunia polimorfisme di C++. Jangan khawatir jika kata ini terdengar menakutkan – pada akhir pelajaran ini, kamu akan merasa sepuasnya dengan polimorfisme seperti dengan sepat basket favoritmu!
Apa itu Polimorfisme?
Sebelum kita melompat ke kode, mari kita mengerti apa arti polimorfisme. Kata ini berasal dari bahasa Yunani: 'poly' yang berarti banyak, dan 'morph' berarti bentuk. Di pemrograman, polimorfisme memungkinkan objek dari jenis yang berbeda untuk diperlakukan sebagai objek dari jenis dasar umum. Ini seperti memiliki remote universal yang dapat mengontrol berbagai perangkat – cukup keren, bukan?
Analogi Dunia Nyata
Bayangkan jika kamu berada di kebun binatang. Kamu melihat berbagai jenis hewan – singa, gajah, penguin. Mereka semua hewan, tetapi mereka berperilaku berbeda. Saat saat makan, pengelola kebun binatang tidak perlu tahu jenis hewan yang mana yang benar-benar. Mereka hanya perlu memberikan perintah umum "makan", dan setiap hewan akan merespon dalam cara mereka masing-masing. Itulah polimorfisme dalam aksi!
Fungsi Virtual
Sekarang, mari kita masuk ke detil polimorfisme di C++, dimulai dengan fungsi virtual.
Apa itu Fungsi Virtual?
Fungsi virtual adalah fungsi khusus di C++ yang memungkinkan program untuk memutuskan fungsi mana yang akan dipanggil saat runtime berdasarkan jenis objek yang di maksud, bukannya jenis pointer atau referensi yang digunakan.
Berikut adalah contoh sederhana:
#include <iostream>
using namespace std;
class Animal {
public:
virtual void makeSound() {
cout << "The animal makes a sound" << endl;
}
};
class Dog : public Animal {
public:
void makeSound() override {
cout << "The dog barks: Woof!" << endl;
}
};
class Cat : public Animal {
public:
void makeSound() override {
cout << "The cat meows: Meow!" << endl;
}
};
int main() {
Animal* animal1 = new Dog();
Animal* animal2 = new Cat();
animal1->makeSound(); // Output: The dog barks: Woof!
animal2->makeSound(); // Output: The cat meows: Meow!
delete animal1;
delete animal2;
return 0;
}
Mari kita pecahkan:
- Kita memiliki kelas dasar
Animal
dengan fungsi virtualmakeSound()
. - Kita membuat dua kelas turunan,
Dog
danCat
, masing-masing meng-override fungsimakeSound()
. - Di
main()
, kita membuat pointer jenisAnimal*
tetapi menugaskan mereka objekDog
danCat
. - Saat kita memanggil
makeSound()
, program tahu untuk memanggil versi yang benar berdasarkan jenis objek aktual, bukannya jenis pointer.
Itulah keajaiban fungsi virtual dan polimorfisme!
Kata Kunci 'virtual'
Kata kunci virtual
sangat penting di sini. Ini memberitahu kompiler bahwa fungsi ini mungkin akan di-override di kelas turunan. Tanpa itu, program akan selalu memanggil versi kelas dasar dari fungsi tersebut.
Fungsi Virtual Bersih
Sekarang, mari kita naik level dan berbicara tentang fungsi virtual bersih.
Apa itu Fungsi Virtual Bersih?
Fungsi virtual bersih adalah fungsi virtual yang tidak memiliki implementasi di kelas dasar. Ini diklarasikan dengan menetapkan 0 pada deklarasi 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 << "Circle area: " << shape1->area() << endl;
cout << "Rectangle area: " << 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 dariarea()
. - Kita dapat membuat pointer
Shape
dan menugaskan mereka objekCircle
danRectangle
. - Saat kita memanggil
area()
, versi yang benar dipanggil berdasarkan jenis objek aktual.
Kelas Abstrak
Sebuah kelas dengan setidaknya satu fungsi virtual bersih disebut kelas abstrak. Anda tidak dapat membuat objek kelas abstrak, tetapi Anda dapat menggunakan pointer dan referensi ke jenis kelas abstrak.
Mengapa Menggunakan Polimorfisme?
- Fleksibilitas: Ini memungkinkan Anda menulis kode yang dapat bekerja dengan objek jenis banyak.
- Ekstensibilitas: Anda dapat menambahkan kelas turunan baru tanpa mengubah kode yang ada.
- Kesederhanaan: Ini dapat menyederhanakan kode dengan memungkinkan Anda untuk menangani objek berbeda secara seragam.
Metode Umum dalam Polimorfisme
Berikut adalah tabel metode umum yang digunakan dalam polimorfisme di C++:
Metode | Deskripsi |
---|---|
virtual |
Kata kunci yang digunakan untuk mendeklarasikan fungsi virtual di kelas dasar |
override |
Kata kunci yang digunakan di kelas turunan untuk menunjukkan bahwa fungsi meng-override fungsi kelas dasar |
= 0 |
Digunakan untuk mendeklarasikan fungsi virtual bersih |
dynamic_cast |
Digunakan untuk downcasting aman dalam hierarki kelas polimorf |
typeid |
Digunakan untuk mendapatkan informasi jenis saat runtime |
Kesimpulan
Polimorfisme adalah fitur yang kuat di C++ yang memungkinkan kode yang fleksibel dan dapat diperpanjang. Dengan menggunakan fungsi virtual dan fungsi virtual bersih, Anda dapat membuat hierarki kelas yang dapat digunakan secara bergantian, menghasilkan kode yang lebih modular dan dapat dipelihara.
Ingat, seperti belajar skill baru, menguasai polimorfisme memerlukan praktek. Jangan kesusahan jika itu tidak klik segera – teruskan coding, teruskan eksperimen, dan segera Anda akan melakukan polimorfisme seperti pro!
Credits: Image by storyset