Nạp chồng (overloading) và ghi đè (overriding) là hai phương thức cơ bản trong lập trình hướng đối tượng. Nạp chồng dùng để tái sử dụng các phương thức cùng tên trong cùng một lớp (class) còn ghi đè được dùng để ghi đè lên các phương thức có tên giống của lớp cơ sở trong lớp kế thừa.
Nạp chồng
hãy tưởng tưởng bạn cần viết một class nhập dữ liệu, bình thường bạn phải khai báo nào là nhapSoNguyen(), nhapSoThuc(), nhapKiTu(), thay vì khai 3 phương thức riêng biệt như thế người ta sử dụng đến phương thức nạp chồng, tức là thay vì phải khai báo nhiều tên phương thức như trên bạn sẽ chỉ cần khai báo một tên phương thức nhiều lần với những tham số khác nhau, ví dụ:
class NhapTT{
public:
void nhap (int n){
cout << "Ban vua nhap so nguyen: " << n << endl;
}
void nhap (char kiTu){
cout << "Ban vua nhap ki tu: " << kiTu << endl;
}
void nhap (float soThuc){
cout << "Ban vua nhap so thuc: " << soThuc << endl;
}
};
Ở ví dụ trên mình khai báo ba phương thức nhap(agr) với kiểu trả về là void và nhận vào ba kiểu dữ liệu khác nhau lần lượt là int, char và float, khi muốn sử dụng nạp chồng ta chỉ cần truyền tham số tương ứng vào phương thức nhap(agr) như sau:
Kiếm tiền Accesstrade, kiếm tiền tại nhà với Accesstrade.vn – Tiếp thị liên kết
MegaURL – Rút gọn link kiếm tiền có giá cao tại Việt Nam
Top những App kiếm tiền online trên điện thoại tốt nhất hiện nay
int main(){
int ng;
char kt;
float st;
NhapTT t1; // khai báo đối tượng t1 thuộc lớp NhapTT
cout << "Nhap so nguyen bat ky: "; cin >> ng;
t1.nhap(ng);
cout << "Nhap ki tu bat ky: "; cin >> kt;
t1.nhap(kt);
cout << "Nhap so thuc bat ky: "; cin >> st;
t1.nhap(st);
}
Kết quả:
Khi gọi hàm nhap() và truyền vào tham số khác nhau thì chương trình sẽ tự gọi tới hàm tương ứng với tham số.
Ghi đè
Khi một lớp con khai báo một phương thức có tên trùng với phương thức trong lớp cha của nó, phương thức gốc sẽ bị ghi đè. Khi đó bất kỳ lời gọi nào đến phương thức đó được thực hiện bên trong lớp con sẽ chỉ gọi đến phương thức mới.
#include <iostream>
#include <string.h>
using namespace std;
class Oto{//l?p co s? otô
public:
void in(){
cout << "toi la oto ahi hi" << endl;
}
void in2(){
cout << "toi la oto ahi hi" << endl;
}
};
class Bus : public Oto{ // l?p k? th?a Bus k? th?a l?p Oto
public:
void in(){
cout << "ten toi la bus nhung toi la mot nhanh cua oto" << endl;
}
};
int main(){
Bus b1;
b1.in();
b1.in2();
}
Kết quả:
Phương thức in() bị ghi đè nên khi được gọi nó sẽ gọi phương thức in() trong lớp kế thừa, phương thức in2() không bị ghi đè nên sẽ gọi đến phương thức của lớp cơ sở.
- Khóa học lập trình C/C++ từ A-Z cho người mới – Giảm giá 40% hôm nay
- Khóa học Java cơ bản dành cho người mới bắt đầu- Giảm 40% hôm nay
- Khóa học lập trình Android từ cơ bản đến thành thạo – Giảm ngay 40%