dẫn xuất, thừa kế và đa hình, đa xạ c++
Lập trình Chương 5: Dẫn xuất/thừa kế và ₫a hình/₫axạ và ₫a hình/₫a xạ 8/6/2012 Nội dung 5.1 Dẫn xuất/thừa kế 5.2 Hàm ảo và cơ chế ₫a hình/₫a xạ 5.3 Lớp thuần ảo 5.4 Kiểm soát truy nhập 5.5 Tương thích kiểu Chương 5: Dẫn xuất/thừa kế và đa hình/đa xạ 2 5.1 Dẫn xuất và kế thừa Nghiên cứu các thuộc tính và phương thức của các loại xe ₫ạp sau X e ₫ạp (Bicycle) Tandem bicycle Chương 5: Dẫn xuất/thừa kế và đa hình/đa xạ 3 Racing Bike Mountain Bike Chương 5: Dẫn xuất/thừa kế và đa hình/đa xạ 4 5.1 Dẫn xuất và kế thừa (…) Tandem bicycle là một loại xe ₫ạp —Xe ₫ạp có hai yên Mountain bicycle là một loại xe ₫ạp —Xe ₫ạp có khả năng chống sốc (lốp dầy và nhiều bắnh răng) Racing bicyle là mộtloạixe₫ạp Racing bicyle là một loại xe ₫ạp —Xe ₫ạp có cấu tạo khí ₫ộng lực học nhẹ Tandem , mountain , racin g bic y cle là nhữn g lo ạ i xe ,,gy g ạ ₫ạp chuyên dụn g — Có các thành phần cơ bản của một chiếc xe ₫ạp Cùng nguyên lý hoạt ₫ộng — Cùng nguyên lý hoạt ₫ộng —Bổ sung thêm các thông tin khác Chương 5: Dẫn xuất/thừa kế và đa hình/đa xạ 5 5.1 Dẫn xuất và kế thừa (…) Cơ chế dẫn xuất/thừa kế là một kỹ thuật lập trình hướng ₫ối tượng cho phép chuyên biệt hóa Dẫnxuấtchophéptạoramộtlớpmới(lớpdẫnxuất) củacác₫ối Dẫn xuất cho phép tạo ra một lớp mới (lớp dẫn xuất) của các ₫ối tượng bằng cách sử dụng các lớp cũ như là các lớp cơ sở —Lớp dẫn xuất thừa hưởng các thuộc tính và hành vi của lớp “cha- mẹ ” (lớpcơ sở) mẹ (lớp cơ sở) —Lớp dẫn xuất là một phiên bản chuyên biệt hóa của lớp “cha-mẹ” Lớ p cơ sở -” lớ p cha mẹ” Bicycle p p Mountain Bikes Racing Bikes Tandem Bikes Chương 5: Dẫn xuất/thừa kế và đa hình/đa xạ 6 Lớp dẫn xuất Ví dụ minh họa sử dụng cơ chế dẫn xuất Xây dựng các lớp biểu diễn về con người, sinh viên, giảng viên Person Tên lớ p Các thuộc tính và phép toán cơ bản của lớp Person Person name: string age: int g ender: strin g Thuộc tính p g g set_name get_name set_age get age Phép toán/ h thứ get _ age set_gender get_gender display p h ương thứ c Chương 5: Dẫn xuất/thừa kế và đa hình/đa xạ 7 Các thuộc tính và phép toán cơ bản của lớp Student và Student L ectu r e Lecture Student name: string age: int gender: string ectu e name: string age: int gender: string fltt class: strin g id: int set_name g et name f acu lt y: s t rin g telnumber: int set_name get_name g _ set_age get_age set_gender g et _g ender set_age get_age set_gender get_gender g_g set_class get_class set_id g et _ id set_faculty get_faculty set_telnumber get_telnumber Chương 5: Dẫn xuất/thừa kế và đa hình/đa xạ 8 g_ display display 5.1 Dẫn xuất và kế thừa (…) Ba lớp trên giống nhau về: —Thuộc tính: N N ame Age gender — Phương thức set_name, get_name set_age, get_age set_gender, get_gender Khác nhau: lớp Student, Lecture có bổ sung thêm các thuộctínhvàphương thức thuộc tính và phương thức Chương 5: Dẫn xuất/thừa kế và đa hình/đa xạ 9 Quan hệ lớp Person name: string age: int Lớp cơ sở age: int gender: string set_name get_name set_age get_age set_gender get_gender dl d isp l ay Lớp dẫn xuất Quan hệ dẫn xuất Student class: string ID: int Lecture Faculty: string T e ln u m be r : in t ID: int set_class get_class set_ID tID eube: t set_faculty get_faculty set_telnumber lb Chương 5: Dẫn xuất/thừa kế và đa hình/đa xạ 10 ge t _ ID display get_te l num b er display [...]... 5: Dẫn xuất /thừa kế và đa hình /đa xạ 25 5.2 Hàm ảo và cơ chế ₫a hình/₫a xạ( ) Kết quả chạy chương trình Tại sao lại vậy? Chương 5: Dẫn xuất /thừa kế và đa hình /đa xạ 26 5.2 Hàm ảo và cơ chế ₫a hình/₫a xạ( ) Nguyên nhân: Trong quá trình liên kết, lời gọi các hàm và hàm thành viên thông thường ₫ược chuyển thành á lệnh hả thà h các lệ h nhảy tới ₫ị chỉ cụ thể của mã th ₫ịa hỉ ủ ã thực hiện hàm => "liên kết... chạy chương trình q ạy g Chương 5: Dẫn xuất /thừa kế và đa hình /đa xạ 18 Các dạng dẫn xuất /thừa kế Chương 5: Dẫn xuất /thừa kế và đa hình /đa xạ 19 Tóm lược Lớp dẫn xuất có hai mục ₫ích cơ bản — Mở rộng các tính năng của lớp cơ sở — Thừa hưởng các thuộc tính và phép toán của lớp cơ sở — Cụ thể hóa các phép toán qua những phương thức khác nhau Ưu ₫iểm của cơ chế thừa hưởng — Xây dựng một mô hình phần mềm... bản sao cho B Chương 5: Dẫn xuất /thừa kế và đa hình /đa xạ 22 Hàm hủy Nếu không ₫ịnh nghĩa hàm hủy cho lớp dẫn xuất B thì compiler sẽ tự sinh ra và gọi hàm hủy của A Quá trình hủy ngược lại với quá trình tạo, phần tạo trước của lớp cơ sở sẽ ₫ược hủy sau Sự cần thiết ₫ịnh nghĩa lại hàm hủy ở lớp dẫn xuất cũng giống như một lớp bình thường Chương 5: Dẫn xuất /thừa kế và đa hình /đa xạ 23 Hàm toán tử gán Nếu... Chương 5: Dẫn xuất /thừa kế và đa hình /đa xạ 28 Kết quả chạy chương trình Như mong ₫ợi chưa? Chương 5: Dẫn xuất /thừa kế và đa hình /đa xạ 29 5.3 Hàm thuần ảo, lớp thuần ảo Hàm thuần ảo (hàm trừu tượng) là hàm ảo có khai báo mà không có ₫ịnh nghĩa Lớp thuần ảo (lớp trừu tượng) là lớp có ít nhất một hàm thuần ảo Lớp thuần ảo chỉ là giao diện, không sử dụng ₫ược diện Bắt buộc phải ₫ịnh nghĩa lớp dẫn xuất... f(){ b = 0;} void h(){} }; void main(){ B b; //OK b.f(); //OK } Chương 5: Dẫn xuất /thừa kế và đa hình /đa xạ 31 Hàm hủy là hàm ảo Hàm hủy lớp cơ sở là ảo thì có thể dùng con trỏ lớp cơ sở ₫ể hủy ₫ối tượng lớp dẫn xuất Nếu hàm hủy lớp cơ sở là ảo thì hàm hủy lớp dẫn xuất cũng tự ₫ộng là ảo Chương 5: Dẫn xuất /thừa kế và đa hình /đa xạ 32 class A{ int n; int *data; public: A(int _n):n(_n){ data = new int[n];}... endl; } Chương 5: Dẫn xuất /thừa kế và đa hình /đa xạ 12 Thực hiện (Lớp Student) //Khai báo lớp Student trong file student.h class Student: public Person { string lop; int id; public: Student(string, int, string, Student(string int string string,int); void set_class(string c); string get_class(); void set_id(int i); int get_id(); void display(); }; Chương 5: Dẫn xuất /thừa kế và đa hình /đa xạ 13 Thực hiện... ~A() Chương 5: Dẫn xuất /thừa kế và đa hình /đa xạ 33 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ế và đa hình /đa xạ 34 5.3 Kiểm... 5: Dẫn xuất /thừa kế và đa hình /đa xạ 14 Thực hiện (Lớp Lecture) // Khai báo lớp Lecture trong file lecture.h class L t l Lecture:public P bli Person{ { string faculty; int telnumber; p public: Lecture(string,int, string, string,int); void set_faculty(string f); string get_faculty(); void set telnumber(int tel); set_telnumber(int int get_telnumber(); void display(); }; Chương 5: Dẫn xuất /thừa kế và đa. .. chương trình chạy, kể cả trong ể trường hợp ta gọi hàm ₫ó qua một con trỏ vào một lớp cơ sở (lớp cơ sở ₫ã khai báo hàm ảo ₫ó) ( p ) Chương 5: Dẫn xuất /thừa kế và đa hình /đa xạ 27 5.2 Hàm ảo và cơ chế ₫a hình/₫a xạ( ) Sửa lại chương trình như sau: — Chỉ cần khai báo hàm display của lớp person là hàm ảo bằng cách thê chữ virtual vào t ớ hà display t á h thêm hữ i t l à trước hàm di l trong phần hầ khai... operator=(const B& b) { A::operator=(b); //hàm toán tử gán của lớp cơ sở m = b.m; //biến B ₫ịnh nghĩa thêm return (*this); ( ); } Chương 5: Dẫn xuất /thừa kế và đa hình /đa xạ 24 5.2 Hàm ảo và cơ chế ₫a hình/₫a xạ Nghiên cứu chương trình minh họa sử dụng các lớp Person, Student và Lecture ở trên //Thực hiện trong file main.cpp void main(){ Person * P *per = new P Person ("J h " 21 " ("John",21,"man"); ") Person . Engineering",123456789); per.display(); stu.display(); lec.display(); } Kết q uả ch ạy chươn g trình q ạy g Chương 5: Dẫn xuất /thừa kế và đa hình /đa xạ 18 Các dạng dẫn xuất /thừa kế Chương 5: Dẫn xuất /thừa kế và đa hình /đa xạ 19 Tóm lược Lớp dẫn xuất. Tandem bicycle Chương 5: Dẫn xuất /thừa kế và đa hình /đa xạ 3 Racing Bike Mountain Bike Chương 5: Dẫn xuất /thừa kế và đa hình /đa xạ 4 5.1 Dẫn xuất và kế thừa (…) Tandem bicycle là một loại xe. khác Chương 5: Dẫn xuất /thừa kế và đa hình /đa xạ 5 5.1 Dẫn xuất và kế thừa (…) Cơ chế dẫn xuất /thừa kế là một kỹ thuật lập trình hướng ₫ối tượng cho phép chuyên biệt hóa Dẫnxuấtchophéptạoramộtlớpmới(lớpdẫnxuất)