ที่นี่เราจะเห็นความแตกต่างประเภทต่างๆ ประเภทคือ −
- เฉพาะกิจ
- รวม
- พาราเมตริก
- บังคับ
Ad-Hoc polymorphism เรียกว่าโอเวอร์โหลด ซึ่งช่วยให้ฟังก์ชันที่มีชื่อเดียวกันทำงานในลักษณะที่แตกต่างกันสำหรับประเภทต่างๆ ทั้งฟังก์ชันและตัวดำเนินการสามารถโอเวอร์โหลดได้ บางภาษาไม่รองรับโอเปอเรเตอร์โอเวอร์โหลด แต่ฟังก์ชันโอเวอร์โหลดเป็นเรื่องปกติ
ตัวอย่าง
#include<iostream> using namespace std; int add(int a, int b) { return a + b; } string add(string a, string b) { return a + b; //concatenate } int main() { cout << "Addition of numbers: " << add(2, 7) << endl; cout << "Addition of Strings: " << add("hello", "World") << endl; }
ผลลัพธ์
Addition of numbers: 9 Addition of Strings: helloWorld
การรวมพหุสัณฐานเรียกว่าเป็นการพิมพ์ย่อย ซึ่งช่วยให้ชี้คลาสที่ได้รับโดยใช้พอยน์เตอร์และการอ้างอิงคลาสพื้นฐาน นี่คือความแตกต่างระหว่างรันไทม์ เราไม่ทราบประเภทของวัตถุจริงจนกว่าจะดำเนินการ เราต้องการฟังก์ชันเสมือนใน C++ เพื่อให้ได้ความหลากหลายที่รวมอยู่ในนี้
ตัวอย่าง
#include<iostream> using namespace std; class Base { public: virtual void print() { cout << "This is base class." << endl; } }; class Derived : public Base { public: void print() { cout << "This is derived class." << endl; } }; int main() { Base *ob1; Base base_obj; Derived derived_obj; ob1 = &base_obj; //object of base class ob1->print(); ob1 = &derived_obj; //same pointer to point derived object ob1->print(); }
ผลลัพธ์
This is base class. This is derived class.
ความแตกต่างของการบีบบังคับเรียกว่าเป็นการหล่อ ความหลากหลายประเภทนี้เกิดขึ้นเมื่อวัตถุหรือวัตถุดั้งเดิมถูกโยนเป็นประเภทอื่น การหล่อมีสองประเภท การแคสต์โดยนัยทำได้โดยใช้คอมไพเลอร์เอง และการแคสต์ที่ชัดเจนทำได้โดยใช้ const_cast, dynamic_cast เป็นต้น
ตัวอย่าง
#include<iostream> using namespace std; class Integer { int val; public: Integer(int x) : val(x) { } operator int() const { return val; } }; void display(int x) { cout << "Value is: " << x << endl; } int main() { Integer x = 50; display(100); display(x); }
ผลลัพธ์
Value is: 100 Value is: 50
Parametric polymorphism เรียกว่า Early Binding ความหลากหลายประเภทนี้ทำให้สามารถใช้โค้ดเดียวกันสำหรับประเภทต่างๆ ได้ เราหาได้โดยใช้เทมเพลต
ตัวอย่าง
#include<iostream> using namespace std; template <class T> T maximum(T a, T b) { if(a > b) { return a; } else { return b; } } int main() { cout << "Max of (156, 78): " << maximum(156, 78) << endl; cout << "Max of (A, X): " << maximum('A', 'X') << endl; }
ผลลัพธ์
Max of (156, 78): 156 Max of (A, X): X