Bài giảng Lập trình hướng đối tượng C++ - Chương 9: Thừa kế (Inheritance)

ppt 24 trang huongle 3780
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình hướng đối tượng C++ - Chương 9: Thừa kế (Inheritance)", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pptbai_giang_lap_trinh_huong_doi_tuong_c_chuong_9_thua_ke_inher.ppt

Nội dung text: Bài giảng Lập trình hướng đối tượng C++ - Chương 9: Thừa kế (Inheritance)

  1. CHƯƠNG 9: THỪA KẾ (INHERITANCE) Bộ môn Hệ Thống Máy Tính và Truyền Thông Khoa Công Nghệ Thông Tin và Truyền Thông Đại học Cần Thơ Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 1
  2. Chương 9 Nội dung n Khái niệm n Lớp dẫn xuất đơn giản n Ký hiệu các thứ bậc n Hàm xây dựng và hàm hủy n Thành viên lớp được bảo vệ n Lớp cơ sở riêng, chung và được bảo vệ n Đa thừa kế - Sự mơ hồ n Hàm ảo - Lớp cơ sở ảo n Chuyển kiểu n Các toán tử được tái định nghĩa Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 2
  3. Chương 9 Khái niệm n Kế thừa từ các lớp có từ trước. n Í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ự LỚP CHA Lớp cơ sở STUDENT (Base class) (Super class) Lớp dẫn xuất LỚP CON CIT_STUDENT (Derived class) (Sub class) Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 3
  4. Chương 9 Ví dụ minh họa Ký hiệu n composition ContactDir Contact #include class ContactDir { #include private: class Contact { int Lookup(const char *name); private: Contact contacts; // ds cac doi tac char *name; // ten doi tac int dirSize; // kich thuoc thu muc hien tai char *address; // dia chi doi tac char *tel; // so dien thoai int maxSize; // kich thuoc thu muc toi da public: public: Contact (const char *name, ContactDir (const int maxSize); const char *address, const char *tel); ~ContactDir(); ~Contact (); void Insert(const Contact&); const char* Name () const { return name;} void Delete(const char *name); const char* Address() const { return address;} Contact* Find(const char *name); const char* Tel() const { return tel;} friend ostream& operator << friend ostream& operator << (ostream&, ContactDir&); ( ostream&, Contact& ); // }; }; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 4
  5. Chương 9 Ví dụ minh họa (tt) n ContactDir Contact Ký hiệu Thừa kế SmartDir class SmartDir : public ContactDir { Contact* SmartDir::Recent (void) { private: return recent == 0 ? 0 : char *recent; // ten duoc tim gan nhat ContactDir::Find(recent); public: } SmartDir(const int max) : ContactDir(max) Contact* SmartDir::Find (const char *name) { { recent = 0; } Contact *c = ContactDir::Find(name); Contact* Recent (void); if (c != 0) Contact* Find (const char *name); recent = (char*) c->Name(); // . return c; }; } Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 5
  6. Chương 9 Ví dụ (tt) - mô tả trong bộ nhớ contacts contacts dirSize dirSize maxSize maxSize ContactDir *recent SmartDir *contacts 1 *contacts 1 Contact 1 *contacts 2 Contact 1 *contacts 2 *contacts 3 *contacts 3 Contact 2 Contact 2 *contacts i *contacts i *contacts n *contacts n Contact i Contact i Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 6
  7. Chương 9 Hàm xây dựng và hàm hủy n Trong 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. n 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. A B C Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 7
  8. Chương 9 Hàm xây dựng và hàm hủy (tt) class SmartDir : public ContactDir { private: char *recent; // ten duoc tim gan nhat Gọi hàm public: xây dựng SmartDir(const int max) : ContactDir(max) của lớp cha { recent = 0; } SmartDir(const SmartDir& sd): ContactDir(sd) { recent = 0; } ~SmartDir() { Thu hồi vùng nhớ của con trỏ thành viên delete recent; của lớp con nếu đã } cấp vùng nhớ trong hàm xây dựng. // . }; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 8
  9. Chương 9 Thành viên lớp được bảo vệ n 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. n Thuộc tính truy cập protectedprotected: ¨ Cho phép lớp con truy xuất. class Foo { class ContactDir { public: // // cac thanh vien chung private: protected: // cac thanh vien rieng int Lookup (const char *name); protected: // cac thanh vien duoc bao ve Contact contacts; // ds cac doi tac public: int dirSize; // kich thuoc hien tai // cac thanh vien chung nua int maxSize; // kich thuoc toi da protected: // cac thanh vien duoc bao ve nua }; }; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 9
  10. Chương 9 Lớp cơ sở riêng, chung và được bảo vệ Lớp cơ sở Thừa kế public Thừa kế private Thừa kế protected private _ _ _ public public private protected protected protected private protected class A { class B : A { // Thừa kế dạng private private: . int x; }; void Fx (void); class C : private A { // A là lớp cơ sở riêng của B public: }; int y; class D : public A { // A là lớp cơ sở chung của C void Fy (void); protected: }; int z; class E : protected A { // A: lớp cơ sở được bảo vệ void Fz (void); . }; }; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 10
  11. Chương 9 Đa thừa kế OptionList Window class OptionList { class Window { public: public: OptionList (int n); Window (Rect &); ~OptionList (); ~Window (void); Menu // // }; }; class Menu : public OptionList, public Window { public: Menu (int n, Rect &bounds); ~Menu (void); // }; Menu::Menu (int n, Rect &bounds) : OptionList(n), Window(bounds) { /* */ } Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 11
  12. Chương 9 Sự mơ hồ trong đa thừa kế class OptionList { class Window { public: public: // // void Highlight (int part); void Highlight (int part); }; }; class Menu : public OptionList, Hàm cùng tên Chỉ rõ hàm public Window của lớp nào { . }; void main() { void main() { Gọi xử lý Menu m1( .); hàm Menu m1( .); hàm m1.OptionList::Highlight(10); của lớp m1.Highlight(10); m1.Window::Highlight(20); nào ? . . } } Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 12
  13. Chương 9 Chuyển kiểu n Có 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ỏ. m Menu m(n, bounds); win OptionList data members Window win = m; Window Window &wRef = m; data members Window data members Window *wPtr = &menu; Menu data members n Không được thực hiện phép gán ngược: ¨ Đối tượng lớp con = Đối tượng lớp cha; // SAI class Menu : public OptionList, public Window { Nếu muốn thực hiện Menu phải tự định nghĩa public: phép ép kiểu // Menu (Window&); }; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 13
  14. Chương 9 Hàm ảo n 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). class ContactDir { class SortedDir : public ContactDir { // public: public: int Lookup (const char *name); SortedDir(const int max) : ContactDir(max) {} // int Lookup(const char *name); }; }; void main() { cout Lookup(“ABC”); ContactDir c1(10); . Gọi SortedDir *p; p = &c1; } hàm nào ? Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 14
  15. Chương 9 Hàm ảo (tt) n 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). Gọi hàm ¨ Thể hiện tính đa hình của OOP. của lớp nào ? class ContactDir { void main() { // ContactDir c1(10); public: SortedDir *p1; p1 = &c1; virtual int Lookup (const char *name); Kết quả }; cout Lookup(“ABC”); trên màn hình class SortedDir : public ContactDir { SortedDir c2(20); // . là gì? ContactDir *p2; p2 = &c2; public: int Lookup(const char *name); cout Lookup(“ABC”); }; } Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 15
  16. Chương 9 Lớp cơ sở ảo n Sự mơ hồ - dư thừa dữ liệu class OptionList : public Widget, List { /* */ }; class Window : public Widget, Port { /* */ }; class Menu : public OptionList, public Window { /* */ }; Đối tượng Menu Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 16
  17. Chương 9 Lớp cơ sở ảo (tt) n Cách xử lý: dùng lớp cơ sở ảo. class OptionList : virtual public Widget, public List { /* */ }; class Window : virtual public Widget, Chỉ có 1 public Port đối tượng Widget { /* */ }; class Menu : public OptionList, Menu::Menu (int n, Rect &bounds) : public Window Widget(bounds), OptionList(n), Window(bounds) { /* */ }; { // } Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 17
  18. Chương 9 Các toán tử được tái định nghĩa n Tươ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 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. n Cẩn thận với toán tử new và delete. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 18
  19. BỔ SUNG MỘT SỐ VẤN ĐỀ KHÁC CẦN TỰ TÌM HIỂU THÊM Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 19
  20. Bổ sung Stream n Nhậ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. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 20
  21. Bổ sung Template n Thiế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). Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 21
  22. Bổ sung Exception n Exception (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. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 22
  23. Bổ sung Container n Container (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++. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 23
  24. Kết thúc chương trình CÂU HỎI? Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 24