intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Kỹ thuật lập trình C/C++: Chương 10 (2) - Lê Thành Sách

Chia sẻ: _ _ | Ngày: | Loại File: PDF | Số trang:36

56
lượt xem
8
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Bài giảng "Kỹ thuật lập trình C/C++ - Chương 10: Lập trình hướng đối tượng" chủ đề nâng cao trình bày các nội dung: Đa thừa kế, đa thừa kế - thừa kế ảo, đa hình (polymorphism), đa hình - hàm có tính abstract,... Mời các bạn cùng tham khảo.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Kỹ thuật lập trình C/C++: Chương 10 (2) - Lê Thành Sách

  1. Chương 10 Lập trình hướng đối tượng -- chủ đề nâng cao -- Lê Thành Sá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 1 CuuDuongThanCong.com https://fb.com/tailieudientucntt © 2017
  2. 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 CuuDuongThanCong.com https://fb.com/tailieudientucntt © 2017
  3. Đa thừa kế n Là gì? n Là một lớp thừa kế các thành viên từ nhiều hơn một lớp, như ví dụ sau. Lớp ConsultantManager và PermanentManager, có đến 2 lớp cha. Trường hợp tổng quát: có thể có nhiều cha. http://www.uml-diagrams.org/generalization.html 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 3 CuuDuongThanCong.com https://fb.com/tailieudientucntt © 2017
  4. Đ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 CuuDuongThanCong.com https://fb.com/tailieudientucntt © 2017
  5. Dùng dấu phẩy “,” để liệt kê các lớp cha class Employee{ }; class TemporaryEmployee: public Employee{ }; class PermanentEmployee: public Employee{ }; class Consultant: public TemporaryEmployee{ }; class Manager: public Employee{ }; class ConsultantManager: public Consultant, public Manager{ }; class Director: public Manager{ }; class PermanentManager: public Manager, public PermanentEmployee{ }; 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 5 CuuDuongThanCong.com https://fb.com/tailieudientucntt © 2017
  6. Đ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 CuuDuongThanCong.com https://fb.com/tailieudientucntt © 2017
  7. Vùng nhớ của Vùng nhớ của Employee Employee Vùng nhớ của Vùng nhớ của Manager PermanentEmployee Vùng nhớ của PermanentManager Theo cách mô tả thừa kế như slide trước: Bên trong đối tượng kiểu “PermanentManager” có đến 2 đối tượng kiểu “Employee” hoàn toàn riêng biệt và khác nhau 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 7 CuuDuongThanCong.com https://fb.com/tailieudientucntt © 2017
  8. Đ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 CuuDuongThanCong.com https://fb.com/tailieudientucntt © 2017
  9. Đa thừa kế: Minh hoạ (I) Chứa tên của lớp con: ClassB hoặc ClassC class ClassA{ private: Khởi động biến string derived_class_name; public: ClassA(string name): derived_class_name(name){ cout
  10. Đ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
  11. Đa thừa kế: Minh hoạ (I) ClassC thừa kế ClassA, với tính public Gọi hàm khởi tạo lớp ClassA class ClassC: public ClassA{ public: ClassC(string name): ClassA(name){ cout
  12. Đ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 CuuDuongThanCong.com https://fb.com/tailieudientucntt © 2017
  13. Đa thừa kế: Minh hoạ (I) (1) obj: chứa bên trong đến 2 đối tượng kiểu ClassA (2): nếu gọi “display” như dòng này sẽ báo lỗi. Vì: có hai phiên bản của “display” cùng tồn tại, bộ biên dịch không biết phải dùng hàm nào. int main(){ ClassD obj; obj.ClassB::display(); obj.ClassC::display(); //obj.display(); 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 13 CuuDuongThanCong.com https://fb.com/tailieudientucntt © 2017
  14. Đ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 CuuDuongThanCong.com https://fb.com/tailieudientucntt © 2017
  15. Đa thừa kế: thừa kế ảo (virtual) n Thừa kế ảo là gì? n Như trường hợp ở slide trước: đối tượng của lớp cha (như ClassA ở trên) có thể được cấp phát lặp lại nhiều hơn 1 lần à không mong muốn n Đây là bài toán: “diamon problem” n Thừa kế ảo (virtual) giúp cho đối tượng của lớp cha (như ClassA ở trên) chỉ được cấp phát một lần. n Khai báo ntn? Như slide 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 15 CuuDuongThanCong.com https://fb.com/tailieudientucntt © 2017
  16. Đa thừa kế: thừa kế ảo (virtual) Từ khoá virtual class ClassB: virtual public ClassA{ public: ClassB(string name): ClassA(name){ cout
  17. Đa thừa kế: thừa kế ảo (virtual) Không cần dùng virtual với 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 17 CuuDuongThanCong.com https://fb.com/tailieudientucntt © 2017
  18. Đ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 CuuDuongThanCong.com https://fb.com/tailieudientucntt © 2017
  19. Đa thừa kế: thừa kế ảo: Minh hoạ (I) n Nếu chỉ đơn giản thêm từ khoá “virtual” vào khai báo cho các lớp ClassB và ClassC như slide trước, sẽ có lỗi biên dịch n Lớp ClassA không có hàm khởi tạo mặc nhiên. n Lý do: n Lớp ClassD (con chung) không gọi hàm khởi tạo cho lớp ClassA è Hàm khởi tạo mặc nhiên của ClassA sẽ được gọi, nhưng nó không có – xem lớp ClassA. class ClassD: public ClassB, public ClassC{ public: ClassD(): ClassB("ClassB"), ClassD không khởi động cho ClassA 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 19 CuuDuongThanCong.com https://fb.com/tailieudientucntt © 2017
  20. Đ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 CuuDuongThanCong.com https://fb.com/tailieudientucntt © 2017
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2