Nội dung Khái niệm Định nghĩa lớp dẫn xuất Các thành phần thừa kế Phạm vi truy nhập các thành phần của lớp cơ sở... Nhận xét: Một lớp dẫn xuất ngoài các thành phần của riêng n
Trang 1CHƯƠNG 9: THỪA KẾ
Mục tiêu
Giúp sinh viên hiểu sâu hơn về tính Thừa kế trong lập trình HĐT, cách định nghĩa lớp thừa kế và các thành phần liên quan
Nội dung
Khái niệm
Định nghĩa lớp dẫn xuất
Các thành phần thừa kế
Phạm vi truy nhập các thành phần của lớp cơ sở
Trang 2- Lớp dẫn xuất là lớp được xây dựng bằng việc thừa kế từ
một lớp khác Lớp được thừa kế gọi là lớp cơ sở.
- Một lớp có thể là dẫn xuất từ một hoặc nhiều lớp cơ sở nhưng cũng có thể là lớp cơ sở để xây dựng các lớp dẫn xuất
Ví dụ: Lớp B là lớp dẫn xuất của lớp A nhưng cũng có thể
là lớp cơ sở của lớp C
Một lớp nào đó có thể được dẫn xuất từ nhiều lớp cơ sở
Khái niệm
Trang 3Nhận xét:
Một lớp dẫn xuất ngoài các thành phần của riêng nó còn được thừa kế tất cả các thành phần của các lớp cơ sở liên quan
Khái niệm
Trang 4Cú pháp:
class Tên_lớp dẫn xuất: public/ private lớp_cơ sở
{ khai báo các thuộc tính
public:
khai báo, định nghĩa các phương thức };
Trong đó:
- Từ khóa public hoặc private cho biết lớp dẫn xuất thừa
kế từ lớp cơ sở theo kiểu public hoặc private
- Nếu không nêu rõ public hay private thì ngầm định là
private
Định nghĩa lớp dẫn xuất
Trang 5- Nếu kế thừa theo dạng public thì tất cả các thành phần
public của lớp cơ sở cũng là thành phần public của lớp dẫn xuất
- Nếu kế thừa theo dạng private thì tất cả các thành phần
public của lớp cơ sở sẽ là thành phần private của lớp dẫn xuất
Định nghĩa lớp dẫn xuất
Trang 6- Thừa kế dữ liệu: Có nghĩa là các thuộc tính của lớp cơ sở được thừa kế trong lớp dẫn xuất
- Lúc này, thuộc tính của lớp dẫn xuất = thuộc tính lớp cơ
sở + thuộc tính riêng
- Tuy nhiên, trong lớp dẫn xuất không được phép truy nhập đến các thuộc tính private của lớp cơ sở
Ví dụ:
Class LOP1
{
kdl thuoc_tinh1.1, thuoc_tinh 1.2, …;
public: … }
Các thành phần thừa kế
Trang 7class LOP2
{ kdl thuoc_tinh2.1, thuoc_tinh 2.2, …;
public: … }
Class LOP3: public LOP2, LOP1
{ kdl thuoc_tinh1, thuoc_tinh2, …;
public:…
}
⇒ Hãy xác định tập thuộc tính của LOP3?
Các phương thức của LOP3 được thao tác trên thuộc tính nào?
Các thành phần thừa kế
Trang 8- Thừa kế phương thức: Trừ hàm tạo, hàm hủy của lớp cơ
sở Tất cả các phương thức của lớp cơ sở đều được thừa
kế trong lớp dẫn xuất
Các thành phần thừa kế
Trang 9- Các thành phần private của lớp cơ sở không được phép truy nhập trong lớp dẫn xuất
- Do đó, nếu muốn truy nhập vào thành phần nào đó trong lớp cơ sở từ lớp dẫn xuất thì ta cần khai báo dưới dạng
public hoặc protected
- Có sự khác nhau giữa public và protected
Nếu thành phần được khai báo bởi public thì được truy nhập bất cứ đâu trong chương trình Còn khai báo bằng
protected thì chỉ được truy nhập trong lớp cơ sở và lớp dẫn xuất trực tiếp
Phạm vi truy nhập đến các thành phần
của lớp cơ sở
Trang 10- Để phân biệt được các thành phần của các lớp, ta cần sử dụng tên lớp + toán tử dẫn xuất :: đặt trước tên thành phần
Ví dụ:
Giả sử ta có lớp C kế thừa từ 2 lớp A và B
Khi đó:
C h; khai báo đối tượng thuộc lớp C
h.C::n là thuộc tính n được khai báo trong C
h.A::n là thuộc tính n được khai báo trong A
h.A::pthuc() là phương thức trong A
h.B::pthuc() là phương thức trong B
Sử dụng các thành phần của lớp dẫn xuất
Trang 11- Xây dựng lớp HCN
Gồm các thuộc tính: d, r
Các phương thức nhập: nhapdl(), dientich(), chuvi()
=> Xây dựng lớp HHOPCN kế thừa từ lớp HCN
Khai báo một đối tượng HHOPCN, hiển thị ra màn hình chuvi, diện tích đáy, diện tích toàn phần và thể tích của nó
Ví dụ
Trang 12- Với các thuộc tính khai báo trong lớp dẫn xuất ta sử dụng lệnh gán như thông thường
- Các thành phần kiểu đối tượng Để khởi gán giá trị cho các đối tượng này cần sử dụng hàm tạo của lớp tương ứng
- Các thuộc tính kế thừa từ lớp cơ sở Để khởi gán cho các thuộc tính này cần sử dụng hàm tạo của lớp cơ sở
Cách xây dựng hàm tạo của lớp dẫn xuất
Trang 13Ví dụ:
Ta có lớp A:
class A
{
double a;
public :
A( double x) { a=x; }
void in() { cout<<"a="<<a<<endl; } };
Cách xây dựng hàm tạo của lớp dẫn xuất
Trang 14Lớp B:
class B
{ double b;
public :
B( double x) { b=x; }
void in() { cout<<"b="<<b<<endl; } };
Yêu cầu:
Định nghĩa lớp C kế thừa từ lớp B, có thuộc tính có kiểu đối tượng của lớp A
Xây dựng hàm tạo và phương thức in() để hiển thị cả a, b, c.
Cách xây dựng hàm tạo của lớp dẫn xuất
Trang 15- Xây dựng lớp NGUOI gồm thuộc tính: hoten Các phương thức: nhap(), xuat().
+ Xây dựng lớp SINHVIEN kế thừa từ lớp NGUOI và bổ sung các thuộc tính: Masinhvien, d1,d2,d3; các phương thức: nhap(), tinhdiem(), xuat() Với công thức tính điểm (d1+d2+d3*2)/4
+ Xây dựng lớp NHANVIEN kế thừa từ lớp NGUOI và bổ sung các thuộc tính Manhanvien, hesoluong, phucap; Các phương thức: nhap(), tinhluong(), xuat().
với công thức tính lương: 830*hesoluong+phucap
Bài tập thực hành