Trong bài viết này, chúng ta sẽ hiểu sự khác biệt giữa nạp chồng hàm (function overloading) và ghi đè hàm (function overriding) trong C++.
Nạp chồng (Overloading)
- Không sử dụng từ khóa đặc biệt.
- Khai báo hàm khác nhau chỉ về số lượng hoặc kiểu tham số.
- Xảy ra tại thời gian biên dịch (compile time).
- Constructor có thể nạp chồng.
- Destructor không thể nạp chồng.
- Dùng để đạt được liên kết sớm (early binding).
- Phiên bản hàm được gọi xác định bởi số lượng hoặc kiểu tham số.
- Các hàm được định nghĩa lại với cùng tên, khác số lượng hoặc kiểu tham số.
Ghi đè (Overriding)
- Khai báo hàm giữ nguyên (cùng tên, cùng tham số).
- Xảy ra tại thời gian chạy (runtime).
- Hàm ảo (virtual) không thể bị ghi đè (Lưu ý: hàm ảo ĐƯỢC thiết kế để ghi đè, văn bản gốc có thể nhầm lẫn).
- Destructor có thể được ghi đè.
- Ghi đè còn gọi là liên kết muộn (late binding).
- Hàm bị ghi đè trong lớp cơ sở đi kèm từ khóa 'virtual'.
- Địa chỉ đối tượng lớp con gán cho con trỏ lớp cơ sở, hàm được gọi qua con trỏ.
- Khi định nghĩa hàm, dùng từ khóa 'virtual' trong lớp cơ sở.
- Cùng hàm được định nghĩa lại trong lớp dẫn xuất dùng từ khóa 'override' (C++11).