Bài giảng Kỹ thuật lập trình C/C++: Chương 10 (2) - Lê Thành Sách
lượt xem 8
download
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.
Bình luận(0) Đăng nhập để gửi bình luận!
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
- 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
- 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
- Đ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
- Đ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
- 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
- Đ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
- 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
- Đ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
- Đ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
- Đ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
- Đ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
- Đ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
- Đ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
- Đ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
- Đ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
- Đa thừa kế: thừa kế ảo (virtual) Từ khoá virtual class ClassB: virtual public ClassA{ public: ClassB(string name): ClassA(name){ cout
- Đ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
- Đ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
- Đ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
- Đ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
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Kỹ thuật lập trình - Phạm Thế Bảo
0 p | 220 | 32
-
Bài giảng Kỹ thuật lập trình: Chương I - Lưu Hồng Việt
48 p | 194 | 23
-
Bài giảng Kỹ thuật lập trình: Chương IV - Lưu Hồng Việt
32 p | 151 | 17
-
Bài giảng Kỹ thuật lập trình: Chương III - Lưu Hồng Việt
51 p | 148 | 15
-
Bài giảng Kỹ thuật lập trình: Chương V - Lưu Hồng Việt
19 p | 127 | 15
-
Bài giảng Kỹ thuật lập trình: Phần 1 - ĐH CNTT&TT
37 p | 114 | 10
-
Bài giảng Kỹ thuật lập trình - Bài 1: Tổng quan về kỹ thuật lập trình
65 p | 165 | 8
-
Bài giảng Kỹ thuật lập trình: Bài 1 - Phạm Đình Sắc
9 p | 129 | 7
-
Bài giảng Kỹ thuật lập trình nâng cao: Chương 4 - ThS. Dương Thành Phết
26 p | 92 | 7
-
Bài giảng Kỹ thuật lập trình - Chương 10: Tổng kết môn học (Trường Đại học Bách khoa Hà Nội)
67 p | 15 | 4
-
Bài giảng Kỹ thuật lập trình: Chương 1 - Trần Quang
39 p | 8 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 2 - Trần Quang
25 p | 10 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 3 - Trần Quang
52 p | 10 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 4 - Trần Quang
32 p | 7 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 6 - Trần Quang
37 p | 11 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 7 - Trần Quang
28 p | 6 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 8 - Trần Quang
34 p | 8 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 9 - Trần Quang
33 p | 4 | 2
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn