Bài giảng Kỹ thuật lập trình - Chương 10: Lập trình hướng đối tượng (Phần 3) - Lê Thành Sách

Nội dung
n Đa thừa kế
n Đa thừa kế: thừa kế ảo
n Khởi động lớp cha trong thừa kế ảo
n Đa hình (polymorphism)
n Đa hình: hàm có tính abstract
n Tổng kết 
pdf 36 trang xuanthi 27/12/2022 1820
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kỹ thuật lập trình - Chương 10: Lập trình hướng đối tượng (Phần 3) - Lê Thành Sách", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • pdfbai_giang_ky_thuat_lap_trinh_chuong_10_lap_trinh_huong_doi_t.pdf

Nội dung text: Bài giảng Kỹ thuật lập trình - Chương 10: Lập trình hướng đối tượng (Phần 3) - Lê Thành Sách

  1. Nội dung n Đa thừa kế n Đa thừa kế: thừa kế ảo n Khởi động lớp cha trong thừa kế ảo n Đa hình (polymorphism) n Đa hình: hàm có tính abstract n Tổng kết Trường Đại Học Bách Khoa Tp.HCM Lập trình C/C++ Khoa Khoa học và Kỹ thuật Máy tính 2 © 2017
  2. Đa thừa kế n Mô tả đa thừa kế ntn? n Liệt kê các lớp cha như ví dụ sau. n Sử dụng dấu phẩy để ngăn cách. Trường Đại Học Bách Khoa Tp.HCM Lập trình C/C++ Khoa Khoa học và Kỹ thuật Máy tính 4 © 2017
  3. Đa thừa kế n Sơ đồ bộ nhớ của đối tượng n Giả sử có hệ thống lớp như hình vẽ, n Cũng giả sử code C++ được sinh ra như slide trước. n Xét dòng khai báo biến (tạo đối tượng) như sau: PermanentManager obj; n Bộ nhớ của đối tượng “obj” được tổ chức ntn? Trường Đại Học Bách Khoa Tp.HCM Lập trình C/C++ Khoa Khoa học và Kỹ thuật Máy tính 6 © 2017
  4. Đa thừa kế: Minh hoạ (I) n Xét sơ đồ đa thừa kế như hình vẽ Hiện thực cho các lớp cho ở các slide kế tiếp Trường Đại Học Bách Khoa Tp.HCM Lập trình C/C++ Khoa Khoa học và Kỹ thuật Máy tính 8 © 2017
  5. Đa thừa kế: Minh hoạ (I) ClassB thừa kế ClassA, với tính public Gọi hàm khởi tạo lớp ClassA class ClassB: public ClassA{ public: ClassB(string name): ClassA(name){ cout << "In ClassB(string name)" << endl; } }; Trường Đại Học Bách Khoa Tp.HCM Lập trình C/C++ Khoa Khoa học và Kỹ thuật Máy tính 10 © 2017
  6. Đa thừa kế: Minh hoạ (I) ClassD thừa kế cả hai lớp ClassB và ClassC Gọi hàm khởi tạo của hai lớp cha: ClassB và ClassC class ClassD: public ClassB, public ClassC{ public: ClassD(): ClassB("ClassB"), ClassC("ClassC") { } }; Trường Đại Học Bách Khoa Tp.HCM Lập trình C/C++ Khoa Khoa học và Kỹ thuật Máy tính 12 © 2017
  7. Đa thừa kế: Minh hoạ (I) Kết quả chạy chương trình In ra 4 dòng, vì sao? int main(){ ClassD obj; obj.ClassB::display(); obj.ClassC::display(); //obj.display(); Sẽ báo lỗi nếu dùng! return 0; }; Trường Đại Học Bách Khoa Tp.HCM Lập trình C/C++ Khoa Khoa học và Kỹ thuật Máy tính 14 © 2017
  8. Đa thừa kế: thừa kế ảo (virtual) Từ khoá virtual class ClassB: virtual public ClassA{ public: ClassB(string name): ClassA(name){ cout << "In ClassB(string name)" << endl; } }; class ClassC: virtual public ClassA{ public: ClassC(string name): ClassA(name){ cout << "In ClassC(string name)" << endl; } }; Trường Đại Học Bách Khoa Tp.HCM Lập trình C/C++ Khoa Khoa học và Kỹ thuật Máy tính 16 © 2017
  9. Đa thừa kế: thừa kế ảo (virtual) n Vấn đề khởi động lớp cha: n (1) Gọi hàm khởi động cho lớp cha chung, như ClassA, phải từ lớp con chung, như lớp ClassD. n Các khởi động ở lớp trung gian, như ClassB và ClassC đều không có tác dụng. n (2) Nếu lớp con chung không gọi hàm khởi động của lớp cha chung thì hàm khởi tạo mặc nhiên (không thông số) của lớp cha chung sẽ được gọi. Trường Đại Học Bách Khoa Tp.HCM Lập trình C/C++ Khoa Khoa học và Kỹ thuật Máy tính 18 © 2017
  10. Đa thừa kế: thừa kế ảo: Minh hoạ (I) class ClassD: public ClassB, public ClassC{ public: ClassD(): ClassA("From ClassD"), ClassB("ClassB"), ClassC("ClassC") { } }; Nếu khởi động lớp ClassA tại lớp ClassD, và hàm main cho sau đây: Trường Đại Học Bách Khoa Tp.HCM Lập trình C/C++ Khoa Khoa học và Kỹ thuật Máy tính 20 © 2017
  11. Tính đa hình trong lập trình hướng đối tượng Trường Đại Học Bách Khoa Tp.HCM Lập trình C/C++ Khoa Khoa học và Kỹ thuật Máy tính 22 © 2017
  12. Đa hình là gì? n Tại sao gọi là đa hình n Hàm foo(), như slide trước, hoạt động như thế nào là tuỳ thuộc vào phiên bản nào (của lớp con nào) thật sự được gọi tại thời điểm thực thi n Cũng có nghĩa: chỉ mỗi một dòng lệnh ptr->foo(); n Cách hoạt động (hành xử) khác nhau n Nên được gọi là đa hình Trường Đại Học Bách Khoa Tp.HCM Lập trình C/C++ Khoa Khoa học và Kỹ thuật Máy tính 24 © 2017
  13. Đa hình: Minh hoạ (I) class BaseClass{ public: void foo(){ cout foo(); return 0; }; Trường Đại Học Bách Khoa Tp.HCM Lập trình C/C++ Khoa Khoa học và Kỹ thuật Máy tính 26 © 2017
  14. Đa hình: Minh hoạ (I) Khai báo nào sẽ hỗ trợ tính đa hình? Trả lời: sử dụng từ khoá “virtual” như ví dụ sau. Trường Đại Học Bách Khoa Tp.HCM Lập trình C/C++ Khoa Khoa học và Kỹ thuật Máy tính 28 © 2017
  15. Có thể dùng từ khoá override nếu muốn Đa hình: Minh hoạ (I) cho rõ ràng, từ khoá này nằm sau cùng, liền class BaseClass{ trước dấu { public: virtual void foo(){ cout foo(); return 0; DerivedClass }; Trường Đại Học Bách Khoa Tp.HCM Lập trình C/C++ Khoa Khoa học và Kỹ thuật Máy tính 30 © 2017
  16. Đa hình: Bài tập ClassA virtual display(); Giả sử có hệ thống các lớp như hình, tất cả thừa kế đều có tính public. Con trỏ “ptr” được khai báo: ClassB display() override; ClassA* ptr; Phiên bản “display” của lớp nào ClassC được gọi trong các dòng sau đây? ClassD ptr = new ClassA(); ptr->display(); display() override; ptr = new ClassB(); ptr->display(); ptr = new ClassC(); ptr->display(); ptr = new ClassD(); ptr->display(); ClassE ptr = new ClassE(); ptr->display(); Trường Đại Học Bách Khoa Tp.HCM Lập trình C/C++ Khoa Khoa học và Kỹ thuật Máy tính 32 © 2017
  17. Đa hình: Hàm có tính abstract n Hàm (phương thức) có tính abstract: n Các lớp con phải hiện thực hàm có tính này. n Lớp X nào có chứa hàm có tính này thì không thể tạo được đối tượng với kiểu lớp X được. n Tại sao phải dùng tính abstract: n Khi thiết kế các dự án lớn, có những lớp được thiết kế để chỉ quy định rằng lớp đó có hỗ trợ tính năng (hàm gì), còn hiện thực thì nằm ở lớp con thừa kế từ nó. n Với tính năng này cộng với đa thừa kế: C++ có thể hiện thực được khái niệm “interface” của Java. Trường Đại Học Bách Khoa Tp.HCM Lập trình C/C++ Khoa Khoa học và Kỹ thuật Máy tính 34 © 2017
  18. Tổng kết n Các tính năng đã học trong phần này n Tính đa hình n Đây là tính năng khá hay của OOP n Tính năng này có được là do công việc xác định hàm được gọi được thực hiện tại thời điểm chương trình thực thi (run-time), không phải tại thời điểm biên dịch (compile-time). n Cũng có nghĩa, n Những hàm không có tính “virtual” thì bộ biên dịch biết được phiên bản nào của hàm đó được dùng ngay tại thời điểm biên dịch. n Hàm có tính abstract, giúp cho quá trình thiết kế tách biệt giữa những quy định và hiện thực những quy định (khái niệm trừu tượng!) Trường Đại Học Bách Khoa Tp.HCM Lập trình C/C++ Khoa Khoa học và Kỹ thuật Máy tính 36 © 2017