Dalam tutorial ini, kita akan belajar tentang polimorfisme di C ++ dengan bantuan contoh.
Polimorfisme adalah konsep penting dari pemrograman berorientasi objek. Ini berarti lebih dari satu bentuk. Artinya, entitas yang sama (fungsi atau operator) berperilaku berbeda dalam skenario yang berbeda. Sebagai contoh,
The +
operator dalam C ++ digunakan untuk melakukan dua fungsi tertentu. Ketika digunakan dengan angka (integer dan angka floating-point), itu melakukan penambahan.
int a = 5; int b = 6; int sum = a + b; // sum = 11
Dan saat kita menggunakan +
operator dengan string, ia melakukan penggabungan string. Sebagai contoh,
string firstName = "abc "; string lastName = "xyz"; // name = "abc xyz" string name = firstName + lastName;
Kita dapat mengimplementasikan polimorfisme di C ++ menggunakan cara berikut:
- Fungsi kelebihan beban
- Operator kelebihan beban
- Fungsi menimpa
- Fungsi virtual
Fungsi C ++ Overloading
Di C ++, kita dapat menggunakan dua fungsi yang memiliki nama yang sama jika keduanya memiliki parameter yang berbeda (baik tipe maupun jumlah argumen).
Dan, bergantung pada jumlah / jenis argumen, fungsi yang berbeda dipanggil. Sebagai contoh,
// C++ program to overload sum() function #include using namespace std; // Function with 2 int parameters int sum(int num1, int num2) ( return num1 + num2; ) // Function with 2 double parameters double sum(double num1, double num2) ( return num1 + num2; ) // Function with 3 int parameters int sum(int num1, int num2, int num3) ( return num1 + num2 + num3; ) int main() ( // Call function with 2 int parameters cout << "Sum 1 = " << sum(5, 6) << endl; // Call function with 2 double parameters cout << "Sum 2 = " << sum(5.5, 6.6) << endl; // Call function with 3 int parameters cout << "Sum 3 = " << sum(5, 6, 7) << endl; return 0; )
Keluaran
Jumlah 1 = 11 Jumlah 2 = 12.1 Jumlah 3 = 18
Di sini, kami telah membuat 3 sum()
fungsi berbeda dengan parameter berbeda (jumlah / jenis parameter). Dan, berdasarkan argumen yang diteruskan selama pemanggilan fungsi, suatu tertentu sum()
dipanggil.
Ini adalah polimorfisme waktu kompilasi karena kompilator mengetahui fungsi mana yang akan dijalankan sebelum program dikompilasi.
Untuk mempelajari lebih lanjut, kunjungi tutorial C ++ Function Overloading kami.
C ++ Operator Overloading
Di C ++, kita dapat membebani operator selama kita beroperasi pada tipe yang ditentukan pengguna seperti objek atau struktur.
Kita tidak bisa menggunakan operator overloading untuk jenis dasar seperti int
, double
, dll
Operator overloading pada dasarnya adalah fungsi overloading, dimana fungsi operator yang berbeda mempunyai simbol yang sama tetapi operan yang berbeda.
Dan, bergantung pada operannya, fungsi operator yang berbeda dijalankan. Sebagai contoh,
// C++ program to overload ++ when used as prefix #include using namespace std; class Count ( private: int value; public: // Constructor to initialize count to 5 Count() : value(5) () // Overload ++ when used as prefix void operator ++() ( value = value + 1; ) void display() ( cout << "Count: " << value << endl; ) ); int main() ( Count count1; // Call the "void operator ++()" function ++count1; count1.display(); return 0; )
Keluaran
Hitung: 6
Di sini, kami telah membebani ++
operator, yang beroperasi pada objek Count
kelas (objek count1 dalam kasus ini).
Kami telah menggunakan operator kelebihan beban ini untuk secara langsung menaikkan variabel nilai dari objek count1 1
.
Ini juga merupakan polimorfisme waktu kompilasi .
Untuk mempelajari lebih lanjut, kunjungi tutorial C ++ Operator Overloading kami.
C ++ Function Overriding
Dalam pewarisan C ++, kita dapat memiliki fungsi yang sama di kelas dasar serta kelas turunannya.
Saat kita memanggil fungsi menggunakan objek dari kelas turunan, fungsi dari kelas turunan dieksekusi alih-alih yang ada di kelas dasar.
Jadi, berbagai fungsi dijalankan tergantung pada objek yang memanggil fungsi tersebut.
Ini dikenal sebagai penggantian fungsi di C ++. Sebagai contoh,
// C++ program to demonstrate function overriding #include using namespace std; class Base ( public: virtual void print() ( cout << "Base Function" << endl; ) ); class Derived : public Base ( public: void print() ( cout << "Derived Function" << endl; ) ); int main() ( Derived derived1; // Call print() function of Derived class derived1.print(); return 0; )
Keluaran
Fungsi Turunan
Di sini, kami telah menggunakan print()
fungsi di Base
kelas dan fungsi yang sama di Derived
kelas
Saat kita memanggil print()
menggunakan Derived
objek turunan1, print()
fungsi tersebut menggantikan fungsi Base
dengan menjalankan print()
fungsi Derived
kelas.
Ini adalah polimorfisme waktu proses karena pemanggilan fungsi tidak diselesaikan oleh kompilator, tetapi diselesaikan dalam waktu proses.
Untuk mempelajari lebih lanjut, kunjungi tutorial Penggantian Fungsi C ++ kami.
C ++ Fungsi Virtual
Dalam C ++, kita mungkin tidak dapat mengganti fungsi jika kita menggunakan pointer dari kelas dasar untuk menunjuk ke objek dari kelas turunan.
Menggunakan fungsi virtual di kelas dasar memastikan bahwa fungsi tersebut dapat diganti dalam kasus ini.
Jadi, fungsi virtual sebenarnya berada di bawah fungsi overriding . Sebagai contoh,
// C++ program to demonstrate the use of virtual functions #include using namespace std; class Base ( public: virtual void print() ( cout << "Base Function" << endl; ) ); class Derived : public Base ( public: void print() ( cout << "Derived Function"
Output
Derived Function
Here, we have used a virtual function
print()
in the Base
class to ensure that it is overridden by the function in the Derived
class.
Virtual functions are runtime polymorphism.
To learn more, visit our C++ Virtual Functions tutorial.
Why Polymorphism?
Polymorphism allows us to create consistent code. For example,
Suppose we need to calculate the area of a circle and a square. To do so, we can create a
Shape
class and derive two classes Circle
and Square
from it.
In this case, it makes sense to create a function having the same name
calculateArea()
in both the derived classes rather than creating functions with different names, thus making our code more consistent.