Lập trình hướng đối tượng C++ - Chương 9
lượt xem 48
download
Thừa kế là nhiều hình thức, nhiều kiểu tồn tại Đa hình trong lập trình đa hình hàm: hàm trùng tên, phân biệt bởi danh sách tham số đa hình đối tượng nhìn nhận đối tượng theo nhiều kiểu khác nhau các đối tượng khác nhau giải nghĩa thông điệp.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Lập trình hướng đối tượng C++ - Chương 9
- 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
- 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
- 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 cơ sở LỚP CHA 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
- Chương 9 Ví dụ minh họa Ký hiệu n ContactDir Contact composition #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
- 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
- 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
- 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
- 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
- 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: 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
- Chương 9 Lớp cơ sở riêng, chung và được bảo vệ Lớp cơ sở Thừa kế Thừa kế private Thừa kế protected public 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
- 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 OptionList public: Window data members data members data members Menu (int n, Rect &bounds); ~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
- 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, Chỉ rõ hàm Hàm cùng tên 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
- 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 Nếu muốn thực class Menu : public OptionList, public Window { 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
- 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
- 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: virtual int Lookup (const char *name); SortedDir *p1; p1 = &c1; cout
- 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
- 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
- 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
- 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
- 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
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Giáo trình Lập trình hướng đối tượng C++ - Đặng Ngọc Hoàng Thành
208 p | 470 | 141
-
Bài Báo Cáo Thực Hành Môn Học : Lập Trình Hướng Đối Tượng C++
22 p | 561 | 131
-
Bài giảng Lập trình hướng đối tượng C++ - Chương 1: Các đặc điểm của C++
45 p | 61 | 10
-
Bài giảng Lập trình hướng đối tượng C++ - Chương 5: Hàm xây dựng, hàm hủy và việc khởi tạo đối tượng
20 p | 62 | 9
-
Bài giảng Lập trình hướng đối tượng C++ - Chương 3: Lớp và đối tượng
20 p | 51 | 9
-
Bài giảng Lập trình hướng đối tượng C++ - Chương 7: Tái định nghĩa tác tử
12 p | 59 | 8
-
Bài giảng Lập trình hướng đối tượng C++ - Chương 6: Hàm bạn và lớp bạn
9 p | 38 | 8
-
Bài giảng Lập trình hướng đối tượng C++ - Chương 4: Hàm thành viên
13 p | 39 | 8
-
Bài giảng Lập trình hướng đối tượng C++ - Chương 2: Lập trình hướng đối tượng
53 p | 46 | 8
-
Bài giảng Lập trình hướng đối tượng C++ - Chương 8: Thừa kế
20 p | 39 | 8
-
Bài giảng Ngôn ngữ lập trình C - Phần 2: Lập trình hướng đối tượng C ++
19 p | 84 | 6
-
Bài giảng Lập trình hướng đối tượng C: Chương 5 - ThS. Trần Anh Dũng
84 p | 52 | 5
-
Bài giảng Lập trình hướng đối tượng C: Chương 4 - ThS. Trần Anh Dũng
48 p | 54 | 5
-
Bài giảng Lập trình hướng đối tượng C: Chương 8 - ThS. Trần Anh Dũng
64 p | 75 | 5
-
Bài giảng Lập trình hướng đối tượng C: Chương 7 - ThS. Trần Anh Dũng
44 p | 55 | 4
-
Bài giảng Lập trình hướng đối tượng C: Chương 6 - ThS. Trần Anh Dũng
70 p | 47 | 4
-
Bài giảng Lập trình hướng đối tượng C: Chương 3 - ThS. Trần Anh Dũng
62 p | 54 | 4
-
Bài giảng Lập trình hướng đối tượng C: Chương 1 - ThS. Trần Anh Dũng
50 p | 88 | 4
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn