Đa hình (Polymorphism) là tính năng chính của lập trình hướng đối tượng có nghĩa là có nhiều hình thức. Trong C++, điều này được chia thành đa hình thời gian biên dịch (compile-time) và đa hình thời gian chạy (runtime).
Ví dụ đa hình thời gian biên dịch là nạp chồng hàm (function overloading) hoặc nạp chồng toán tử (operator overloading). Ví dụ đa hình thời gian chạy là ghi đè hàm (function overriding).
Ví dụ đa hình bằng nạp chồng hàm trong C++ như sau.
Ví dụ
#include <iostream>
using namespace std;
class Example {
public:
void func(int a) {
cout << "\nGiá trị của a: " << a;
}
void func(int a, int b) {
cout << "\nGiá trị của a: " << a;
cout << "\nGiá trị của b: " << b;
}
void func(char c) {
cout << "\nGiá trị của c: " << c;
}
};
int main() {
Example obj;
cout << "\nMột giá trị int";
obj.func(5);
cout << "\nMột giá trị char";
obj.func('A');
cout << "\nHai giá trị int";
obj.func(7, 2);
return 0;
}
Kết quả
Một giá trị int Giá trị của a: 5 Một giá trị char Giá trị của c: A Hai giá trị int Giá trị của a: 7 Giá trị của b: 2
Hãy hiểu chương trình trên.
Hàm thành viên func() trong lớp Example được nạp chồng (overloaded). Có 3 hàm func() với tham số khác nhau có thể chọn tùy ý.
class Example {
public:
void func(int a) {
cout << "\nGiá trị của a: " << a;
}
void func(int a, int b) {
cout << "\nGiá trị của a: " << a;
cout << "\nGiá trị của b: " << b;
}
void func(char c) {
cout << "\nGiá trị của c: " << c;
}
};
Trong hàm main(), đối tượng obj của lớp Example được tạo. Hàm func() được gọi với các đối số khác nhau để minh họa nạp chồng hàm.
int main() {
Example obj;
cout << "\nMột giá trị int";
obj.func(5);
cout << "\nMột giá trị char";
obj.func('A');
cout << "\nHai giá trị int";
obj.func(7, 2);
return 0;
}