Professional Documents
Culture Documents
An() NhanVien
Uong()
Chucvu
Di()
(Chay)
Phonglamviec - Sử dụng lại code
Tinhluong() - Giảm số lượng code
Tamung() cần viết.
- Dễ sửa đổi, cập nhật
- Rõ rang hơn, logic
hơn trong thiết kế
chương trình
KẾ THỪA (INHERITANCE)
Khái niệm:
Kế thừa cho phép định nghĩa các lớp mới
từ các lớp đã có.
www.themegallery.com
KẾ THỪA (INHERITANCE)
Phân loại:
Đơn kế thừa: Một lớp kế thừa từ một lớp khác
Đa kế thừa: Một lớp kế thừa từ nhiều lớp khác
A
A B C
A A
B
B B C D C D
KẾ THỪA (INHERITANCE)
C¸ch x©y dùng líp dÉn xuÊt : Gi¶ sö ®· ®Þnh
nghÜa líp A. §Ó x©y dùng líp B dÉn xuÊt tõ A, ta
viÕt nhưsau:
class B : kieu_ke_thua A {
private:
// Khai bao thuoc tinh
public:
// Cac phuong thuc
} ;
www.themegallery.com
KẾ THỪA (INHERITANCE)
Có 3 kiểu kế thừa:
class B: private A
class B: protected A
class B: public A
Thành phần protected: là thành phần có thể được truy
xuất bởi các phương thức trong lớp dẫn xuất, nhưng
không thể truy xuất từ ngoài lớp đó.
www.themegallery.com
KẾ THỪA (INHERITANCE)
www.themegallery.com
KẾ THỪA (INHERITANCE)
Bảng tổng hợp các kiểu kế thừa
Kiểu kế thừa
private protected public
private private private private
Phạm vi
Phạm vi: Phạm vi truy xuất của các biến/thành phần trong
lớp cơ sở (cha)
Cột: Các kiểu kế thừa
www.themegallery.com
KẾ THỪA (INHERITANCE)
Ví dụ:
www.themegallery.com
KẾ THỪA (INHERITANCE)
Ví dụ:
www.themegallery.com
KẾ THỪA (INHERITANCE)
Ví dụ:
www.themegallery.com
KẾ THỪA (INHERITANCE)
Thừa kế các thành phần dữ liệu (thuộc tính)
Tập thuộc tính của lớp dẫn xuất sẽ gồm: các
thuộc tính mới khai báo trong định nghĩa lớp dẫn
xuất và các thuộc tính của lớp cơ sở.
Tuy vậy trong lớp dẫn xuất không cho phép truy
nhập đến các thuộc tính private của lớp cơ sở.
Chú ý: Cho phép đặt trùng tên thuộc tính trong
các lớp cơ sở và lớp dẫn xuất.
www.themegallery.com
KẾ THỪA (INHERITANCE)
Kế thừa phương thức:
Lớp dẫn xuất được thừa kế các phương thức public
của lớp cơ sở.
Trừ:
- Hàm tạo
- Hàm huỷ
- Toán tử gán
www.themegallery.com
Hµm t¹o vµ hµm hñy ®èi víi tÝnh thõa kÕ
Cách xây dựng hàm tạo của lớp dẫn xuất
Hàm tạo cần có các đối số để khởi gán cho các
thuộc tính (thành phần dữ liệu) của lớp.
Có thể phân thuộc tính làm 3 loại ứng với 3 cách
khởi gán khác nhau:
• Các thuộc tính mới khai báo trong lớp dẫn
xuất: Trong các phương thức của lớp dẫn xuất có
thể truy xuất đến các thuộc tính này. Vì vậy chúng
thường được khởi gán bằng các câu lệnh gán viết
trong thân hàm tạo.
www.themegallery.com
Hµm t¹o vµ hµm hñy ®èi víi tÝnh thõa kÕ
• Các thành phần kiểu đối tượng: Trong lớp dẫn
xuất không cho phép truy nhập đến các thuộc tính
của các đối tượng này. Vì vậy để khởi gán cho các
đối tượng thành phần cần dùng hàm tạo của lớp
tương ứng.
• Các thuộc tính thừa kế từ các lớp cở sở: Trong
lớp dẫn xuất không được phép truy nhập đến các
thuộc tính này. Vì vậy để khởi gán cho các thuộc tính
nói trên, cần sử dụng hàm tạo của lớp cơ sở.
www.themegallery.com
Hµm t¹o vµ hµm hñy ®èi víi tÝnh thõa kÕ
• Cách thức cũng giống như khởi gán cho các đối
tượng thành phần, chỉ khác nhau:
• Để khởi gán cho các đối tượng thành phần ta dùng tên đối
tượng thành phần
• Để khởi gán cho các thuộc tính thừa kế từ các lớp cơ sở ta
dùng tên lớp cơ sở:
Tên_đối_tượng_thành_phần(danh sách giá
trị): Tên_lớp_cơ_sở(danh sách giá trị)
www.themegallery.com
Hµm t¹o vµ hµm hñy ®èi víi tÝnh thõa kÕ
• Ví dụ:
#include <iostream>
class A {
protected:
int x;
public:
A()
{ x = 0;}
A(int x) {
this->x = x;
}
void xuatA() {
std::cout << "x = " << x << "\n";
}
};
www.themegallery.com
Hµm t¹o vµ hµm hñy ®èi víi tÝnh thõa kÕ
• Ví dụ:
class B: public A {
private:
int y;
public:
// su dung constructor cua lop A
B(int x, int y) : A(x){
this->y = y;
}
void xuatB() {
A::xuatA(); // su dung method cua lop A
std::cout << "y = " << y << "\n";
}
};
www.themegallery.com
Hµm t¹o vµ hµm hñy ®èi víi tÝnh thõa
kÕ
• Ví dụ:
int main() {
A a;
B b(5, 10);
a.xuatA();
b.xuatB();
return 0;
}
Kết quả:
www.themegallery.com
Hµm t¹o vµ hµm hñy ®èi víi tÝnh thõa kÕ
Hµm huû
Khi một đối tượng của lớp dẫn xuất được giải
phóng (bị huỷ), thì các đối tượng thành phần và
các đối tượng thừa kế từ các lớp cơ sở cũng bị
giải phóng theo. Do đó các hàm huỷ tương ứng
sẽ được gọi đến.
Như vậy khi xây dựng hàm huỷ của lớp dẫn xuất,
chúng ta chỉ cần quan tâm đến các thuộc tính
(không phải là đối tượng) khai báo thêm trong
lớp dẫn xuất mà thôi. Ta không cần để ý đến các
đối tượng thành phần và các thuộc tính thừa kế
từ các lớp cơ sở.
www.themegallery.com
Bài tập
Bài 1:
Xây dựng lớp Nguoi gồm các thông tin: ID, tên và
các phương thức nhập thông tin.
Xây dựng lớp Sinhvien kế thừa lớp Nguoi và có thêm
thuộc tính diem, phương thức xuất dữ liệu.
Viết chương trình chính thực hiện nhập vào một
danh sách n sinh viên, sau đó hiển thị danh sách vừa
nhập.
www.themegallery.com
Bài tập
Bài 2:
Xây dựng lớp XE gồm các thông tin: Nhãn hiệu, Giá,
Năm sản xuất (yêu cầu các thông tin này chỉ có ở lớp XE
và các lớp dẫn xuất từ lớp XE được phép truy cập).
Xây dựng lớp OTO kế thừa từ lớp XE và có thêm các
thông tin: Số chỗ ngồi, trọng tải và các phương thức nhập
xuất dữ liệu.
Viết chương trình chính thực hiện:
-Nhập vào một danh sách n ô tô
- Hiển thị danh sách vừa nhập.
-Hiển thị danh sách các ô tô có trọng tải lớn hơn một giá
trị v được nhập từ bàn phím.
www.themegallery.com
Bài tập
Bài 3:
Hãy viết chương trình thực hiện các công việc sau:
- Xây dựng lớp cơ sở SanPham gồm:
+ Thuộc tính: tên sản phẩm, năm sản xuất, giá nhập
+ Phương thức: nhập, xuất thông tin sản phẩm
- Xây dựng lớp HoaDon bán sản phẩm kế thừa từ lớp SanPham có
thêm:
+ Thuộc tính: số lượng bán, giá bán
+ Phương thức: nhập, xuất thông tin, tính thành tiền (=số lượng
* giá bán), tính thuế (=10% thành tiền), tính lãi (=(giá bán - giá nhập) *
Số lượng).
www.themegallery.com
Bài tập
Bài 3: (tiếp)
- Trong chương trình chính:
+ Nhập danh sách n hóa đơn bán sản phẩm
+ Sắp xếp danh sách theo tiền lãi giảm dần.
+ In ra màn hình danh sách gồm: số thứ tự, tên sản phẩm, giá
thành, số lượng bán, giá bán, thành tiền, thuế và tiền lãi.
+ Tính tổng tiền của các hoá đơn bán sản phẩm.
www.themegallery.com