Bài giảng môn Lập trình hướng đối tượng - Chương 8: Thừa kế

• Hàm ảo – Cú pháp: khai báo thêm từ khóa virtual trước hàm. – Dùng chung với tính liên kết ñộng => tính ña hình Liên kết tĩnh và liên kết ñộng

pdf5 trang | Chia sẻ: nguyenlam99 | Lượt xem: 989 | Lượt tải: 0download
Bạn đang xem nội dung tài liệu Bài giảng môn Lập trình hướng đối tượng - Chương 8: Thừa kế, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
THỪA KẾ Chương 8 1 Nội dung • Thừa kế ñơn • Thừa kế bội • Liên kết tĩnh và liên kết ñộng 2 Thừa kế ñơn  Khái niệm  Kế thừa từ các lớp ñã có từ trước. => Không phải ñịnh nghĩa nhiều. Thiết kế ñơn giản hơn.  Ích lợi: có thể tận dụng lại  Các thuộc tính chung Các hàm có thao tác tương tự • Khai báo 3 LỚP CHA (Lớp cơ sở) LỚP CON (lớp dẫn xuất) class : { // khai báo lớp con };  • Dạng thừa kế Lớp cơ sở Thừa kế public Thừa kế private Thừa kế protected private _ _ _ public public private protected protected protected private protected Thừa kế ñơn 4 class A { int x; void Fx(); public: int y; void Fy(); protected: int z; void Fz(); }; // Thừa kế dạng private class B : A {. }; // A là lớp cơ sở riêng của C class C : private A { }; // A là lớp cơ sở chung của D class D : public A { }; // A: lớp cơ sở ñược bảo vệ class E : protected A {. }; • Quyền truy xuất trong lớp con – Lớp con có tất cả thành phần (thuộc tính + phương thức) của lớp cha. – Không thể truy xuất thành phần private của lớp cha. Thừa kế ñơn 5 class Diem { int x, y; public: void GanDiem(int h,int t) { x = h; y = t; } void HienDiem() class DiemMau : public Diem { int mau; public: void KTao(int h,int t,int m) { GanDiem(h,t); mau=m; } void Hien() Thừa kế ñơn 6 { cout<<“(” <<x<<“,”<<y <<“)”;} void DoiDiem(int dx, int dy) { x += dx; y += dy; } ... }; { HienDiem(); cout<<mau; } ... }; void main() { DiemMau a; a.KTao(2,5,0); a.HienDiem(); a.DoiDiem(7,8); a.Hien(); } • Hàm xây dựng và hàm hủy - Khi khởi tạo ñối tượng: hàm xây dựng của lớp cha sẽ ñược gọi trước, sau ñó là hàm xây dựng của lớp con. Trong hàm xây dựng của lớp con phải gọi hàm xây dựng của lớp cha ñể khởi tạo thuộc tính của lớp cha - Khi hủy bỏ ñối tượng: hàm hủy của lớp con sẽ ñược Thừa kế ñơn 7 A B C Khởi tạo Hủy bỏ gọi trước, sau ñó mới là hàm hủy của lớp cha. • Hàm xây dựng và hàm hủy class Diem { int x, y; public: Diem() { x=y=0;} Diem(int h, int t) class DiemMau:public Diem { int mau; public: DiemMau() :Diem() { mau=0; } DiemMau(int h,int t,int m) Thừa kế ñơn 8 { x=h; y=t;} Diem(const Diem& d) { x=d.x; y=d.y;} ... }; :Diem(h,t) { mau=m; } DiemMau(const DiemMau& d1) :Diem(d1){ mau=d1.mau; } ... }; void main() { DiemMau a(2,5,3); DiemMau b; DiemMau c = a; } 2 5 3 x y mau a Diem(2,5) mau=3; • Hàm xây dựng và hàm hủy class SinhVien { char mssv[9]; char* hoten; int namsinh; float diemtb; public: SinhVien() ; class SinhVienNuocNgoai : public SinhVien { char* nuoc; char sopassport[12]; public: SinhVienNuocNgoai() : SinhVien() { nuoc = new char[30]; strcpy(sopassport,””); } SinhVienNuocNgoai(const SinhVienNuocNgoai& s) Thừa kế ñơn 9 SinhVien(char*,char*,int,float); SinhVien(const SinhVien&); void operator=(const SinhVien&); ~SinhVien() { delete[] hoten; } void Nhap(); void In(); ... }; //ðịnh nghĩa các hàm thành viên : SinhVien(s) { nuoc = strdup(s.nuoc); strcpy( sopassport , s.sopassport); } ~SinhVienNuocNgoai() { delete[] nuoc; } ... }; • Tái ñịnh nghĩa dữ liệu thành viên – Thuộc tính của lớp con trùng tên thuộc tính của lớp cha. – Trong lớp con, nếu ta truy xuất ñến dữ liệu trùng tên ñó thì sẽ truy xuất ñến dữ liệu của lớp con. – Truy xuất dữ liệu lớp cha : :: class LopCha { LopCon::LopCon():LopCha() Thừa kế ñơn 10 public: int a; LopCha() { a= 0; } }; class LopCon:public LopCha { public: int a; LopCon(); void Hien(); }; { a = 1; } void LopCon::Hien() { cout << a << LopCha::a; } void main() { LopCon x; x.Hien(); cout << x.a << x.LopCha::a; } • Tái ñịnh nghĩa hàm thành viên – Hàm thành viên của lớp con trùng tên với hàm thành viên của lớp cha. – Gọi hàm trùng tên => gọi hàm của lớp con. – Gọi hàm của lớp cha : ::() Thừa kế ñơn 11 class Diem { int x, y; public: ... void Hien() { cout<<“(”<<x<<“,” void DiemMau :: Hien() { Diem::Hien(); cout<<“ mau ”<<mau; } Thừa kế ñơn 12 <<y<<“)”;} }; class DiemMau:public Diem{ int mau; public: void Hien(); ... }; void main() { DiemMau a(2,5,4); a.Hien(); a.DiemMau::Hien(); DiemMau b=a; b.Diem::Hien(); } Thừa kế bội • Ưu ñiểm – Tận dụng ñược những thành phần ñã có sẵn của lớp cha: • Dữ liệu thành viên • Hàm thành viên – Thuận lợi khi sử dụng kết hợp với hàm ảo. 13 SinhViên SinhViênTạiChức – mã số NhânViên – mã số Dữ liệu của SinhViên Dữ liệu của NhânViên Dữ liệu của SinhViênTạiChức Tạo ra ñối tượng Thừa kế bội Vấn ñề cần lưu ý khi sử dụng thừa kế bội  Cạnh tranh trong thừa kế bội.  Thiết kế sơ ñồ thừa kế phải ñúng ý nghĩa.  Nên hạn chế và cẩn thận khi sử dụng thừa kế bội. 14 class XeDien { int loaibinhdien; int thoigian; float tocdo; public: XeDien() { } XeDien(int b, int tg, float td) { } }; class XeDap { char loai[10]; char* mau; int chieucao; public: XeDap() { } XeDap(char* l,char* m,int c){} }; Thừa kế bội 15 class XeDapDien:public XeDap, public XeDien{ public: XeDapDien(); XeDapDien( char*, char*, int , int , int , float ); }; XeDapDien::XeDapDien ():XeDap(), XeDien(){ } XeDapDien::XeDapDien ( char* a, char* b, int c, int d, int e, float f ) : XeDap(a, b, c), XeDien(d,e,f) { } Khai báo lớp trong thừa kế bội Gọi hàm xây dựng của các lớp cha Liên kết tĩnh và liên kết ñộng • Sự tương thích giữa ñối tượng của lớp con và ñối tượng của lớp cha LỚPCHA LỚPCON void main() { LopCha a; LopCon b; a = b; b = a; // Sai Có thể gán Cha = Con Hổn 16 class LopCha { }; class LopCon : public LopCha { }; LopCha *pa; pa = &a; LopCon *pb; pb = &b; pa = &b; pb = &a; // Sai } Con trỏ của lớp cha có thể trỏ ñến ñối tượng của lớp con • Liên kết tĩnh – Con trỏ thuộc lớp nào, khi gọi hàm sẽ gọi hàm của lớp ñó. – Tính chất của ñối tượng ñược nhận biết khi biên dịch CT. class LopCha { public: void main() { LopCha a; LopCha *pa=&a; Liên kết tĩnh và liên kết ñộng 17 void HamThanhVien() { cout<<“Ham cua Lop Cha”;} }; class LopCon:public LopCha { public: void HamThanhVien() { cout<<“Ham cua Lop Con”;} }; //Lớp cha pa->HamThanhVien(); LopCon b; LopCon *pb=&b; //Lớp con pb->HamThanhVien(); pa= &b; //Lớp cha pa->HamThanhVien(); pb= &a; //Báo lỗi } • Hàm ảo – Cú pháp: khai báo thêm từ khóa virtual trước hàm. – Dùng chung với tính liên kết ñộng => tính ña hình class LopCha class LopCon : public LopCha { Liên kết tĩnh và liên kết ñộng 18 { ... public: virtual void HamAo() { } }; ... public: void HamAo() { } };  Hàm hoàn toàn ảo  Cú pháp: chỉ khai báo tên trong lớp cha và gán=0.  Hàm hoàn toàn ảo phải ñịnh nghĩa lại trong lớp con. class LopCha class LopCon:public LopCha Liên kết tĩnh và liên kết ñộng 19 { ... public: virtual void HamHT_Ao()=0; }; { ... public: void HamHT_Ao() { } }; • Liên kết ñộng – Con trỏ ñang trỏ ñến ñối tượng nào, khi gọi hàm ảo sẽ gọi hàm của lớp tạo ra ñối tượng ñó. – Tính chất của ñối tượng ñược nhận biết khi ñang thực thi. class LopCha { public: void main() { LopCha a; Liên kết tĩnh và liên kết ñộng 20 virtual void HamAo() { cout<<“Ham cua Lop Cha”; } }; class LopCon : public LopCha{ public: void HamAo() { cout<<“Ham cua Lop Con”; } }; LopCha *pa=&a; pa->HamAo(); //Lớp cha LopCon b; LopCon *pb=&b; pb->HamAo(); //Lớp con pa= &b; pa->HamAo(); //Hàm lớp con pb= &a; //Báo lỗi }

Các file đính kèm theo tài liệu này:

  • pdftran_quang_hai_bangchapter8_3748.pdf