Bài giảng Lập trình chương 5 trang bị cho người học những kiến thức cơ bản về dẫn xuất/thừa kế và đa hình/đa xạ như: Dẫn xuất/thừa kế, hàm ảo và cơ chế đa hình/đa xạ, lớp thuần ảo, kiểm soát truy nhập, tương thích kiểu.
.c om an co ng Lập trình cu u du o ng th Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ 2/10/2017 CuuDuongThanCong.com https://fb.com/tailieudientucntt Nội dung an co ng c om 5.1 Dẫn xuất/thừa kế 5.2 Hàm ảo chế đa hình/đa xạ 5.3 Lớp ảo 5.4 Kiểm sốt truy nhập 5.5 Tương thích kiểu cu u du o ng th Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com https://fb.com/tailieudientucntt 5.1 Dẫn xuất kế thừa c om Nghiên cứu thuộc tính phương thức loại xe đạp sau Xe đạp (Bicycle) cu u du o ng th an co ng Tandem bicycle Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com https://fb.com/tailieudientucntt Racing Bike cu u du o ng th an co ng c om Mountain Bike Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com https://fb.com/tailieudientucntt 5.1 Dẫn xuất kế thừa (…) c om Tandem bicycle loại xe đạp – Xe đạp có hai yên ng Mountain bicycle loại xe đạp co – Xe đạp có khả chống sốc (lốp dầy nhiều bắnh răng) an Racing bicyle loại xe đạp th – Xe đạp có cấu tạo khí động lực học nhẹ du o ng Tandem, mountain, racing bicycle loại xe đạp chuyên dụng cu u – Có thành phần xe đạp – Cùng nguyên lý hoạt động – Bổ sung thêm thông tin khác Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com https://fb.com/tailieudientucntt 5.1 Dẫn xuất kế thừa (…) ng c om Cơ chế dẫn xuất/thừa kế kỹ thuật lập trình hướng đối tượng cho phép chuyên biệt hóa Dẫn xuất cho phép tạo lớp (lớp dẫn xuất) đối tượng cách sử dụng lớp cũ lớp sở th an co – Lớp dẫn xuất thừa hưởng thuộc tính hành vi lớp “chamẹ” (lớp sở) – Lớp dẫn xuất phiên chuyên biệt hóa lớp “cha-mẹ” ng Lớp sở - ” lớp cha mẹ” u du o Bicycle cu Mountain Bikes Racing Bikes Tandem Bikes Lớp dẫn xuất Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com https://fb.com/tailieudientucntt Ví dụ minh họa sử dụng chế dẫn xuất c om Xây dựng lớp biểu diễn người, sinh viên, giảng viên co ng Các thuộc tính phép tốn lớp Person th cu u du o set_name get_name set_age get_age set_gender get_gender display Tên lớp Thuộc tính ng name: string age: int gender: string an Person Phép toán/ phương thức Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om Các thuộc tính phép tốn lớp Student Lecture Lecture Student co an th ng du o cu u set_name get_name set_age get_age set_gender get_gender set_class get_class set_id get_id display name: string age: int gender: string faculty: string telnumber: int ng name: string age: int gender: string class: string id: int set_name get_name set_age get_age set_gender get_gender set_faculty get_faculty set_telnumber get_telnumber display Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com https://fb.com/tailieudientucntt 5.1 Dẫn xuất kế thừa (…) c om Ba lớp giống về: – Thuộc tính: ng Name Age gender co du o th set_name, get_name set_age, get_age set_gender, get_gender ng an – Phương thức cu u Khác nhau: lớp Student, Lecture có bổ sung thêm thuộc tính phương thức Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com https://fb.com/tailieudientucntt Person Quan hệ lớp name: string age: int gender: string c om ng co set_name get_name set_age get_age set_gender get_gender display Lớp sở an Quan hệ dẫn xuất set_class get_class set_ID get_ID display du o u class: string ID: int cu Student ng th Lớp dẫn xuất Lecture Faculty: string Telnumber: int set_faculty get_faculty set_telnumber get_telnumber display Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com 10 https://fb.com/tailieudientucntt 5.2 Hàm ảo chế đa hình/đa xạ( ) Tại lại vậy? cu u du o ng th an co ng c om Kết chạy chương trình Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com 26 https://fb.com/tailieudientucntt 5.2 Hàm ảo chế đa hình/đa xạ( ) cu u du o ng th an co ng c om Nguyên nhân: Trong trình liên kết, lời gọi hàm hàm thành viên thông thường chuyển thành lệnh nhảy tới địa cụ thể mã thực hàm => "liên kết tĩnh“ Giải pháp sử dụng hàm ảo Hàm ảo hàm thành viên lớp mà phần mã thực xác định cho đối tượng định nghĩa chương trình chạy, kể trường hợp ta gọi hàm qua trỏ vào lớp sở (lớp sở khai báo hàm ảo đó) Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com 27 https://fb.com/tailieudientucntt 5.2 Hàm ảo chế đa hình/đa xạ( ) c om Sửa lại chương trình sau: an co ng – Chỉ cần khai báo hàm display lớp person hàm ảo cách thêm chữ virtual vào trước hàm display phần khai báo lớp Person – Các phần lại giữ nguyên //Khai báo lớp Person file person.h cu u du o ng th #include #include using namespace std; class Person{ //giữ nguyên cũ public: //giữ nguyên cũ virtual void display() }; Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com 28 https://fb.com/tailieudientucntt cu u du o ng th an co ng c om Kết chạy chương trình Như mong đợi chưa? Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com 29 https://fb.com/tailieudientucntt 5.3 Hàm ảo, lớp ảo ng th an co ng c om Hàm ảo (hàm trừu tượng) hàm ảo có khai báo mà khơng có định nghĩa Lớp ảo (lớp trừu tượng) lớp có hàm ảo Lớp ảo giao diện, không sử dụng Bắt buộc phải định nghĩa lớp dẫn xuất Như vậy: cu u du o – Phân biệt rõ phần giao diện phần thực – Có thể cơng khai phần giao diện cho người sử dụng, che giấu phần thực – Có thể thay đổi phần thực mà không ảnh hưởng đến cách sử dụng Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com 30 https://fb.com/tailieudientucntt //Ví dụ co ng c om class A{ int a; public: virtual void f() = 0; }; class B: public A{ int b; public: void f(){ b = 0;} void h(){} }; void main(){ B b; //OK b.f(); //OK } cu u du o ng th class A{ int a; public: virtual void f() = 0; }; class B: public A{ int b; public: void f(){ b = 0;} void h(){} }; void main(){ A a; //Lỗi } an //Ví dụ Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com 31 https://fb.com/tailieudientucntt Hàm hủy hàm ảo cu u du o ng th an co ng c om Hàm hủy lớp sở ảo dùng trỏ lớp sở để hủy đối tượng lớp dẫn xuất Nếu hàm hủy lớp sở ảo hàm hủy lớp dẫn xuất tự động ảo Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com 32 https://fb.com/tailieudientucntt cu u du o ng th an co ng c om class A{ int n; int *data; public: A(int _n):n(_n){ data = new int[n];} ~A(){ delete [] data;} }; class B: public A{ int m; int* data; public: B(int _n,int _m):A(_n),m(_m){data = new int[m];} ~B(){ delete [] data; } }; void main(){ A *pb = new B(5,5); Gọi ~A(); không gọi ~B() không hủy delete pb; pb->data } Giải pháp thêm virtual trước ~A() Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com 33 https://fb.com/tailieudientucntt cu u du o ng th an co ng c om class A{ int n; int *data; public: A(int _n):n(_n){ data = new int[n];} virtual ~A(){ delete [] data;} }; class B: public A{ int m; int* data; public: B(int _n,int _m):A(_n),m(_m){data = new int[m];} ~B(){ delete [] data; } }; void main(){ A *pb = new B(5,5); Gọi ~B(); sau gọi delete pb; ~A() } Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com 34 https://fb.com/tailieudientucntt 5.3 Kiểm soát truy nhập a) Kế thừa dạng public c om class A{ int a; void g(); Public: int n; void f(); Protected: char c; void h(); }; th an co ng class B: public A{ }; du o ng Tất thành viên public protected A giữ nguyên quyền kiểm soát truy nhập cu u – public A public B – protected A protected B – Private A B thừa hưởng không truy nhập trực tiếp Friend không thừa hưởng được; friend lớp có ý nghĩa lớp Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com 35 https://fb.com/tailieudientucntt b) Kế thừa dạng protected ng co public A protected B protected A private B c om class A{ }; class B: protected A{ }; th an B thừa hưởng private A không truy nhập trực tiếp cu u du o ng class C: public B{ void g2(){ h(); //ok;mac du h() trở thành private B f(); //OK; f(x) trở thành protected B } }; void func(C c){ c.n = 1; //LỖI; n protected B c.f(); //LỖI; f() protected B } Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com 36 https://fb.com/tailieudientucntt c) Kế thừa dạng private ng c om class A{ }; class B: private A{ }; an th ng du o class A{ }; class B: A{ }; co Mặc định private ta viết cu u Tất thành viên pubic protected A trở thành private B B thừa kế private A không truy nhập trực tiếp Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com 37 https://fb.com/tailieudientucntt 5.4 Tương thích kiểu co ng c om class A{ }; class B: public A{ }; an Ví dụ th ng cu Ví dụ u du o B b; A a = b; //OK void f(A a){ } f(b); //OK Gọi hàm tự chép A::A(const&) A a; B b1 = a; //LỖI Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com 38 https://fb.com/tailieudientucntt Ví dụ void g(A *pa){ } void main(){ B b; g(&b); //OK } ng c om Đ/c b có kiểu trỏ B (B*) Con trỏ vào B tự động chuyển đổi kiểu sang trỏ A* th an co Kiểu trỏ tham chiếu vào kiểu dẫn xuất tự động chuyển đổi thành trỏ/tham chiếu vào kiểu sở, ngược lại không cu u du o ng A a; B b; A *pa = &b; //OK; tự động chuyển đổi kiểu B *pb = pa; //LỖI; pb = (B*)pa; // biên dịch compiler khơng phát lõi; chạy có lỗi Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com 39 https://fb.com/tailieudientucntt Bài tập cu u du o ng th an co ng c om Thực lại máy tính lớp Person, Student, Lecture theo sườn giảng Chương 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com 40 https://fb.com/tailieudientucntt ...Nội dung an co ng c om 5. 1 Dẫn xuất/thừa kế 5. 2 Hàm ảo chế đa hình/đa xạ 5. 3 Lớp ảo 5. 4 Kiểm soát truy nhập 5. 5 Tương thích kiểu cu u du o ng th Chương 5: Dẫn xuất/thừa kế đa hình/đa... "Electronics1-K53",20080001); Person *lec = new Lecture ("Michel",22,"man", "Electronics Engineering",123 456 789); per->display(); stu->display(); lec->display(); delete per; delete stu; delete lec; } Chương. .. 5: Dẫn xuất/thừa kế đa hình/đa xạ CuuDuongThanCong.com 25 https://fb.com/tailieudientucntt 5. 2 Hàm ảo chế đa hình/đa xạ( ) Tại lại vậy? cu u du o ng th an co ng c om Kết chạy chương trình Chương