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 phần Thừa kế giúp người học nắm bắt các kiến thức: Tại sao cần đến thừa kế, các khái niệm, các kiểu thừa kế, thiết kế các lớp, khởi tạo lớp cha từ lớp con,... Mời các bạn cùng tham khảo.
Chương 10 Lập trình hướng đối tượng Thừa kế-Lê Thành Sách Trường Đại Học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính CuuDuongThanCong.com © 2017 Lập trình C/C++ https://fb.com/tailieudientucntt Nội dung n n n n n n n n Tại cần đến thừa kế Các khái niệm Thừa kế gì? Các kiểu thừa kế Thiết kế lớp (I) Khởi tạo lớp cha từ lớp Thiết kế lớp (II) Tổng kết Trường Đại Học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính CuuDuongThanCong.com © 2017 Lập trình C/C++ https://fb.com/tailieudientucntt Tại cần đến thừa kế n Giả sử hệ thống phần mềm cho trường đại học (Bách Khoa) Nhiều nhóm người dùng dùng hệ thống này, họ là: a) b) c) d) e) f) n Giảng viên (lecturer) Sinh viên (student) Nhân viên văn phòng (clerk) Bảo vệ (guardian) Người dọn dẹp (cleaner) v.v Mỗi nhóm người dùng có tính khác nhau, hệ thống xử lý liệu với nhóm khác n Giải pháp để phầm mềm xử lý liệu với nhóm người theo cách khác nhau? Trường Đại Học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính CuuDuongThanCong.com © 2017 Lập trình C/C++ https://fb.com/tailieudientucntt Tại cần đến thừa kế n (1) Tạo chung cấu trúc “User”, cấu trúc có trường thơng tin “type” Giải thuật xử lý có dạng: switch (type){ case STUDENT:{ //Xử lý, sinh viên } case LECTURER:{ //Xử lý, giảng viên } }; Trường Đại Học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính CuuDuongThanCong.com © 2017 Lập trình C/C++ https://fb.com/tailieudientucntt Tại cần đến thừa kế n (1) Tạo chung cấu trúc “User”, cấu trúc có trường thơng tin “type” Giải thuật xử lý có dạng: n Nhược điểm: n Code dài dịng n Khó thay đổi n Khó mở rộng n … Trường Đại Học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính CuuDuongThanCong.com © 2017 Lập trình C/C++ https://fb.com/tailieudientucntt Tại cần đến thừa kế n (2) Chia thành nhóm nhỏ (lớp) nhỏ như: Student, Lecturer, … Các phương thức xử lý gắn kèm với loại class Student{ public: //Phương thức cho sinh viên }; class Lecturer{ public: //Phương thức cho giảng viên }; … Trường Đại Học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính CuuDuongThanCong.com © 2017 Lập trình C/C++ https://fb.com/tailieudientucntt Tại cần đến thừa kế n (2) Chia thành nhóm (lớp) nhỏ như: Student, Lecturer, … Các phương thức xử lý gắn kèm với loại n Nhược điểm: n Lặp lại code (code duplication) n Ví dụ: n Phương thức “getName”/”setName” (lấy/gán tên) phải thực lại cho tất lớp n Khó bảo trì n Khó thay đổi hay nâng cấp n … Trường Đại Học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính CuuDuongThanCong.com © 2017 Lập trình C/C++ https://fb.com/tailieudientucntt Tại cần đến thừa kế n (3) Sử dụng tính thừa kế (inheritance) n n n Chia tập lớn thành lớp nhỏ (lớp nhỏ, giải pháp số 2) Với lớp có quan hệ “is-a”, khai báo thừa kế cho chúng Tính thừa kế ngơn ngữ lập trình (C++): n Các lớp thừa kế thành viên từ lớp cha n è Tránh lặp lại code nói n n Các lớp cha đại diện cho lớp để xử lý thơng điệp (tính polymorphism) è Dễ thiết kế + dễ thay đổi Trường Đại Học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính CuuDuongThanCong.com © 2017 Lập trình C/C++ https://fb.com/tailieudientucntt Các khái niệm (I) Guardian Lecturer Student Accountant Cleaner Staff User Chia nhỏ tập hợp “User” thành tập hợp Trường Đại Học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính CuuDuongThanCong.com © 2017 Lập trình C/C++ https://fb.com/tailieudientucntt Các khái niệm (I) Lý thuyết tập hợp Hướng đối tượng Thuật ngữ Tập cha Lớp cha Base class Parent class Super-class Tập Lớp Derived class Child-class Sub-class Trường Đại Học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính CuuDuongThanCong.com © 2017 Lập trình C/C++ 10 https://fb.com/tailieudientucntt Định nghĩa lại phương thức: Minh hoạ class ClassA{ private: string name; public: ClassA(string name){ this->name = name; } string getName(){ return this->name; } void setName(string name){ this->name = name; } }; ClassA: có phương thức getName(): trả liệu “name” giữ Trường Đại Học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính CuuDuongThanCong.com © 2017 Lập trình C/C++ 60 https://fb.com/tailieudientucntt Định nghĩa lại phương thức: Minh hoạ //Need: #include class ClassB: public ClassA{ public: ClassB(string name): ClassA(name){ } string getName(){ std::string str_temp = ClassA::getName(); std::transform(str_temp.begin(), str_temp.end(), str_temp.begin(), ::toupper); return str_temp; } }; ClassB thừa kế ClassA: • Đã có sẵn getName(): • Nhưng ClassB muốn tên trả phải chuẩn hoá (đổi sang chữ HOA) Trường Đại Học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính CuuDuongThanCong.com © 2017 Lập trình C/C++ 61 https://fb.com/tailieudientucntt Định nghĩa lại phương thức: Minh hoạ ClassA::getName(): gọi lại getName() lớp cha //Need: #include class ClassB: public ClassA{ string getName(){ std::string str_temp = ClassA::getName(); std::transform(str_temp.begin(), str_temp.end(), str_temp.begin(), ::toupper); return str_temp; } }; Chuyển sang chữ hoa, dùng hàm transform Trường Đại Học Bách Khoa Tp.HCM Khoa Khoa học Kỹ thuật Máy tính CuuDuongThanCong.com © 2017 Lập trình C/C++ 62 https://fb.com/tailieudientucntt Định nghĩa lại phương thức: Minh hoạ int main(){ ClassB obj("nguyen van an"); cout