Bài giảng Lập trình hướng đối tượng C++ - Chương 9: Thừa kế (Inheritance)
Khái niệm
Lớp dẫn xuất đơn giản
Ký hiệu các thứ bậc
Hàm xây dựng và hàm hủy
Thành viên lớp được bảo vệ
Lớp cơ sở riêng, chung và được bảo vệ
Đa thừa kế - Sự mơ hồ
Hàm ảo - Lớp cơ sở ảo
Chuyển kiểu
Các toán tử được tái định nghĩa
THỪA KẾCHƯƠNG 9:(INHERITANCE)Bộ môn Hệ Thống Máy Tính và Truyền ThôngKhoa Công Nghệ Thông Tin và Truyền ThôngĐại học Cần Thơ 1Khoa Công Nghệ Thông Tin - Đại Học Cần ThơNội dungKhái niệmLớp dẫn xuất đơn giảnKý hiệu các thứ bậcHàm xây dựng và hàm hủyThành viên lớp được bảo vệLớp cơ sở riêng, chung và được bảo vệĐa thừa kế - Sự mơ hồHàm ảo - Lớp cơ sở ảoChuyển kiểuCác toán tử được tái định nghĩaChương 92Khoa Công Nghệ Thông Tin - Đại Học Cần ThơKhái niệmKế thừa từ các lớp có từ trước.Ích lợi: có thể tận dụng lại Các thuộc tính chung Các hàm có thao tác tương tựChương 9LỚP CHA(Super class)LỚP CON(Sub class)Lớp cơ sở(Base class)Lớp dẫn xuất(Derived class)STUDENTCIT_STUDENT3Khoa Công Nghệ Thông Tin - Đại Học Cần ThơVí dụ minh họaChương 9#include #include class Contact { private: char *name; // ten doi tac char *address; // dia chi doi tac char *tel; // so dien thoai public: Contact (const char *name, const char *address, const char *tel); ~Contact (); const char* Name () const { return name;} const char* Address() const { return address;} const char* Tel() const { return tel;} friend ostream& operator Name(); return c;}Ký hiệuThừa kếContactDirContactnSmartDir5Khoa Công Nghệ Thông Tin - Đại Học Cần ThơVí dụ (tt) - mô tả trong bộ nhớChương 9*contacts 1*contacts 2*contacts 3*contacts i*contacts n**contactsdirSizemaxSize**contactsdirSizemaxSize*recentContact 1Contact 2Contact i*contacts 1*contacts 2*contacts 3*contacts i*contacts nContact 1Contact 2Contact iContactDirSmartDir6Khoa Công Nghệ Thông Tin - Đại Học Cần ThơHàm xây dựng và hàm hủyTrong thừa kế, khi khởi tạo đối tượng: Hàm xây dựng của lớp cha sẽ được gọi trước Sau đó mới là hàm xây dựng của lớp con.Trong thừa kế, khi hủy bỏ đối tượng: Hàm hủy của lớp con sẽ được gọi trước Sau đó mới là hàm hủy của lớp cha.Chương 9ABC7Khoa Công Nghệ Thông Tin - Đại Học Cần ThơHàm xây dựng và hàm hủy (tt)Chương 9class SmartDir : public ContactDir { private: char *recent; // ten duoc tim gan nhat public: SmartDir(const int max) : ContactDir(max) { recent = 0; } SmartDir(const SmartDir& sd): ContactDir(sd) { recent = 0; } ~SmartDir() { delete recent; } // . }; Gọi hàm xây dựng của lớp chaThu hồi vùng nhớcủa con trỏ thành viên của lớp con nếu đãcấp vùng nhớ trong hàm xây dựng.8Khoa Công Nghệ Thông Tin - Đại Học Cần ThơThành viên lớp được bảo vệ Thừa kế: Có tất cả các dữ liệu và hàm thành viên. Không được truy xuất đến thành viên private. Thuộc tính truy cập protected: Cho phép lớp con truy xuất.Chương 9class ContactDir { //... protected: int Lookup (const char *name); Contact **contacts; // ds cac doi tac int dirSize; // kich thuoc hien tai int maxSize; // kich thuoc toi da}; class Foo { public: // cac thanh vien chung... private: // cac thanh vien rieng... protected: // cac thanh vien duoc bao ve... public: // cac thanh vien chung nua... protected: // cac thanh vien duoc bao ve nua...};9Khoa Công Nghệ Thông Tin - Đại Học Cần ThơLớp cơ sở riêng, chung và được bảo vệChương 9class A { private: int x; void Fx (void); public: int y; void Fy (void); protected: int z; void Fz (void);};class B : A { // Thừa kế dạng private . };class C : private A { // A là lớp cơ sở riêng của B }; class D : public A { // A là lớp cơ sở chung của C }; class E : protected A { // A: lớp cơ sở được bảo vệ . }; Lớp cơ sởThừa kế publicThừa kế privateThừa kế protectedprivate___publicpublicprivateprotectedprotectedprotectedprivateprotected10Khoa Công Nghệ Thông Tin - Đại Học Cần ThơĐa thừa kếChương 9OptionListWindowMenuclass Window { public: Window (Rect &); ~Window (void); //...};class Menu : public OptionList, public Window { public: Menu (int n, Rect &bounds); ~Menu (void); //...};Menu::Menu (int n, Rect &bounds) : OptionList(n), Window(bounds) { /* ... */ }class OptionList { public: OptionList (int n); ~OptionList (); //...};11Khoa Công Nghệ Thông Tin - Đại Học Cần ThơSự mơ hồ trong đa thừa kếChương 9class OptionList { public: // void Highlight (int part); };class Window { public: // void Highlight (int part); };class Menu : public OptionList, public Window { . };void main() { Menu m1(.); m1.Highlight(10); .}Gọi hàm của lớp nào ?void main() { Menu m1(.); m1.OptionList::Highlight(10); m1.Window::Highlight(20); .}Chỉ rõ hàm của lớp nàoxử lýHàm cùng tên12Khoa Công Nghệ Thông Tin - Đại Học Cần ThơChuyển kiểuCó sẵn 1 phép chuyển kiểu không tường minh: Đối tượng lớp cha = Đối tượng lớp con; Áp dụng cho cả đối tượng, tham chiếu và con trỏ.Chương 9Không được thực hiện phép gán ngược: Đối tượng lớp con = Đối tượng lớp cha; // SAIMenu m(n, bounds);Window win = m;Window &wRef = m;Window *wPtr = &menu;class Menu : public OptionList, public Window { public: //... Menu (Window&);};Nếu muốn thực hiệnphải tự định nghĩa phép ép kiểuWindow data membersOptionList data membersWindow data membersMenu data memberswinm13Khoa Công Nghệ Thông Tin - Đại Học Cần ThơHàm ảo Liên kết tĩnh (static binding): Xác định khi biên dịch chương trình. Dùng hàm thành viên. Gọi hàm của lớp cơ sở (lớp cha).Chương 9class ContactDir { //... public: int Lookup (const char *name); //...};class SortedDir : public ContactDir { public: SortedDir(const int max) : ContactDir(max) {} int Lookup(const char *name);}; void main() { ContactDir c1(10); SortedDir *p; p = &c1; coutLookup(“ABC”); .}Gọi hàm nào ?14Khoa Công Nghệ Thông Tin - Đại Học Cần ThơHàm ảo (tt)Liên kết động (dynamic binding) Xác định khi thực thi chương trình. Dùng hàm ảo (virtual function). Gọi hàm của lớp dẫn xuất (lớp con). Thể hiện tính đa hình của OOP.Chương 9class ContactDir { //... public: virtual int Lookup (const char *name);};class SortedDir : public ContactDir { //. public: int Lookup(const char *name);}; void main() { ContactDir c1(10); SortedDir *p1; p1 = &c1; coutLookup(“ABC”); SortedDir c2(20); ContactDir *p2; p2 = &c2; coutLookup(“ABC”);}Gọi hàm của lớp nào ?Kết quả trên màn hình là gì?15Khoa Công Nghệ Thông Tin - Đại Học Cần ThơLớp cơ sở ảoChương 9class OptionList : public Widget, List { /*...*/ };class Window : public Widget, Port { /*...*/ };class Menu : public OptionList, public Window { /*...*/ };Đối tượng MenuSự mơ hồ - dư thừa dữ liệu16Khoa Công Nghệ Thông Tin - Đại Học Cần ThơLớp cơ sở ảo (tt)Cách xử lý: dùng lớp cơ sở ảo.Chương 9class OptionList : virtual public Widget, public List { /*...*/ };class Window : virtual public Widget, public Port { /*...*/ };class Menu : public OptionList, public Window { /*...*/ };Menu::Menu (int n, Rect &bounds) : Widget(bounds), OptionList(n), Window(bounds) { //... }Chỉ có 1 đối tượng Widget17Khoa Công Nghệ Thông Tin - Đại Học Cần ThơCác toán tử được tái định nghĩaTương tự như tái định nghĩa hàm thành viên: Che giấu đi toán tử của lớp cơ sở. Hàm xây dựng sao chép: Y::Y (const Y&) Phép gán: Y& Y::operator = (const Y&)Nếu không định nghĩa, sẽ tự động có hàm xây dựng sao chép và phép gán do ngôn ngữ tạo ra.=> SAI khi có con trỏ thành viên.Cẩn thận với toán tử new và delete.Chương 918Khoa Công Nghệ Thông Tin - Đại Học Cần ThơBỔ SUNGMỘT SỐ VẤN ĐỀ KHÁC CẦN TỰ TÌM HIỂU THÊM19Khoa Công Nghệ Thông Tin - Đại Học Cần ThơStreamNhập xuất thông qua Stream (Dòng): Tổng quan về Stream. Đối tượng nhập xuất chuẩn. File. Nhập xuất với File đối tượng. Tái định nghĩa toán tử > với File.Bổ sung20Khoa Công Nghệ Thông Tin - Đại Học Cần ThơTemplateThiết kế lớp theo Template (mẫu): Thế nào là Template. Hàm template. Lớp template. Giới thiệu về STL (Standard Template Library).Bổ sung21Khoa Công Nghệ Thông Tin - Đại Học Cần ThơExceptionException (Ngoại lệ): Ngoại lệ là gì? Đề xuất ngoại lệ - Nắm bắt ngoại lệ. Ngoại lệ trong C++. Cú pháp bắt ngoại lệ trong C++. Sử dụng ngoại lệ với Template.Bổ sung22Khoa Công Nghệ Thông Tin - Đại Học Cần ThơContainerContainer (Lớp vật chứa): Container là gì?Tại sao lại cần Container. Container trong C++. Một số Container trong 1 phiên bản của C++.Bổ sung23Khoa Công Nghệ Thông Tin - Đại Học Cần ThơKết thúc chương trìnhCÂU HỎI?24Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ
File đính kèm:
- bai_giang_lap_trinh_huong_doi_tuong_c_chuong_9_thua_ke_inher.ppt