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

ppt 24 trang phuongnguyen 6640
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 ◼ 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 Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 2
  3. Chương 9 Khái niệm ◼ Kế 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ự 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 ◼ 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. ◼ 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ệ ◼ 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. 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 protected: int maxSize; // kich thuoc toi da // 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; }; class C : private A { // A là lớp cơ sở riêng của B void Fx (void); 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 OptionList object Window object Menu object : public OptionList, public Window { OptionList public: Window OptionList data members Menu (int n, Rect &bounds); data members data members ~Menu (void); Window // data members }; Menu Menu::Menu (int n, Rect &bounds) : data members 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 Menu m1( .); Menu m1( .); xử lý 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 ◼ 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 ◼ 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 public: phải tự định nghĩa // 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 ◼ 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) ◼ 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 ◼ 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) ◼ 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 ◼ 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ế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. 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 ◼ 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 ◼ 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 ◼ 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 ◼ 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