Khái niệm đa hình (polymorphism) trong lập trình hướng đối tượng

Đây là bài 18/19 bài của series môn học Lập trình hướng đối tượng

1. Giới thiệu đa hình (polymorphism)

Đa hình (polymorphism) là 1 trong 4 tính chất của lập trình hướng đối tượng. Hiểu đơn giản, trong các tình huống khác nhau, các đối tượng có thể có những hành vi (operator hoặc function) khác nhau để phù hợp với tình huống đó.

Trong C++, đa hình luôn đi kèm với kế thừa. Do tính kế thừa, một lớp có thể sử dụng lại các phương thức của lớp khác. Lớp dẫn xuất cũng có thể định nghĩa lại một số phương thức của lớp cơ sở. Lúc này, với các phương thức giống nhau nhưng mỗi đối tượng lại có cách xử lý khác nhau. Đó là một thể hiện của tính đa hình.

Trong C++, chúng ta có thể cài đặt tính đa hình với các cách như:

    • Nạp chồng hàm (function overloading)
    • Nạp chồng toán tử (operator overloading)
    • Ghi đè hàm (function overriding)
    • Hàm ảo (virtual function)

2. Nạp chồng (overloading)

2.1. Nạp chồng hàm (function overloading)

Trong C++, 2 hàm có thể trùng tên với nhau nếu danh sách tham số của hàm là khác nhau. Có thể khác nhau về số lượng tham số hoặc kiểu dữ liệu của tham số. Các bạn có thể đọc lại bài Nạp chồng hàm (function overloading) là gì? để xem một số ví dụ nạp chồng hàm trong C++.

2.2. Nạp chồng toán tử (operator overloading)

Nạp chồng toán tử được dùng để định nghĩa lại các toán tử có sẵn như ++, – -, +, -, *, /,… cho kiểu dữ liệu (class) do người lập trình tự định nghĩa. Nhằm tạo ra toán tử cùng tên nhưng thực hiện trên các lớp khác nhau chứ không phải trên các kiểu dữ liệu nguyên thủy. Các bạn có thể đọc lại bài Nạp chồng toán tử (operator overloading) trong C++ để biết cách cài đặt nạp chồng toán tử trong C++.

3. Ghi đè hàm (function overriding)

Trong lớp dẫn xuất (derived class) có thể định nghĩa lại hàm thành phần của lớp cơ sở mà nó thừa kế được. Như vậy, sẽ có hai phiên bản khác nhau của hàm thành phần trong lớp dẫn xuất. Trong phạm vi lớp dẫn xuất, hàm định nghĩa lại trong lớp dẫn xuất sẽ ghi đè (overriding) lên hàm được định nghĩa trong lớp cơ sở.

Các bạn có thể đọc lại bài Lớp dẫn xuất (derived class) trong lập trình hướng đối tượng với C++ để xem ví dụ ghi đè hàm trong kế thừa với C++.

4. Hàm ảo (virtual function)

Trong C++, chúng ta không thể ghi đè hàm nếu sử dụng con trỏ kiểu lớp cơ sở trỏ đến đối tượng của lớp dẫn xuất. Sử dụng hàm ảo trong lớp cơ sở để đảm bảo hàm trong lớp dẫn xuất ghi đè được hàm mà nó kế thừa từ lớp cơ sở.

Các bạn có thể đọc lại bài Hàm ảo (virtual function) trong lập trình hướng đối tượng với C++ để hiểu rõ về hàm ảo trong C++.

5. Tại sao chúng ta cần sử dụng tính đa hình?

Tính đa hình cho phép chúng ta viết code nhất quán. Ví dụ, chúng ta cần tính diện tích của một hình tròn và một hình vuông. Để làm như vậy, chúng ta có thể tạo một lớp Hình, hai lớp Hình trònHình vuông sẽ kế thừa lớp Hình.

Trong trường hợp này, sẽ hợp lý hơn khi tạo một hàm có cùng tên calculateArea() trong cả hai lớp dẫn xuất hơn là tạo các hàm với các tên khác nhau. Do đó, làm cho mã của chúng ta nhất quán, dễ hiểu hơn.

5/5 - (1 bình chọn)
Bài trước và bài sau trong môn học<< Hàm thuần ảo (pure virtual function) và lớp trừu tượng (abstract class) trong C++Khái niệm lớp cơ sở ảo trong lập trình hướng đối tượng với C++ >>
Chia sẻ trên mạng xã hội:

Trả lời

Lưu ý:

1) Vui lòng bình luận bằng tiếng Việt có dấu.

2) Khuyến khích sử dụng tên thật và địa chỉ email chính xác.

3) Mọi bình luận trái quy định sẽ bị xóa bỏ.