Phần 2: Ngôn ngữ lập trình C++ - Chương 4: Kế thừa
lượt xem 12
download
Kế thừa (inheritance): Lớp B kế thừa lớp A, tức là B sẽ có thể tái sử dụng các thành phần dữ liệu và các thao tác trong A
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Phần 2: Ngôn ngữ lập trình C++ - Chương 4: Kế thừa
- Phần 2: Ngôn ngữ lập trình C++ Chương 4: Kế thừa
- Các nội dung chính Các khái niệm cơ bản Phân loại kế thừa Kế thừa đơn Tính đa hình Lớp trừu tượng Kế thừa bội
- Các khái niệm cơ bản Kế thừa (inheritance): L ớp B kế thừa lớp A, tức là B sẽ có thể tái sử dụng các thành phần dữ liệu và các thao tác trong A A Lớp cha (lớp cơ sở) B Lớp con (lớp dẫn xuất)
- Ví dụ về sự kế thừa Lớp Số Giá trị +, , *, / ,==,… Lớp Số Nguyên Lớp Số Thực Giá trị nguyên Giá trị thực +, , *, / +, , *, / ,==,… ,==,… Lớp Phân Số Lớp Số Phức Giá trị mẫu số Giá trị phức +, , *, / +, , *, / ,==,… ,==,…
- Phân loại kế thừa Có hai cách phân loại Theo m độ kế thừa: có 2 m ức ức Public: bảo toàn m độ che dấu của các thành phần của ức lớp cơ sở trong lớp dẫn xuất Private: đưa các m che dấu của các thành phần trong lớp ức cơ sở lên m private trong lớp dẫn xuất ức Theo số lượng lớp cơ sở: có 2 loại Kế thừa đơn Kế thừa bội
- Cú pháp khai báo kế thừa Kế thừa đơn class B: < A { E> Trong đó E có thể //Đ/n phần thân của lớp dẫn xuất là: }; public private class C: < A>A, < B>B { E E Kế thừa bội //Đ/n phần thân của lớp dẫn xuất };
- Kế thừa đơn Chương trình 4.1: xây dựng hai lớp số Real và Complex, trong đó lớp Complex kế thừa lớp Real class Real { class Real { //tiếp từ hình bên protected: Real Add(Real x){ float r; Real z; public: z.r =x.r +r; Real(float a=0){ return z; r =a; } } void Print(){ //tiếp ở hình bên cout< r; < }; } };
- Chương trình 4.1 (tiếp) class Complex: public Real { //tiếp từ hình bên Complex Add(Complex x) class Complex: public Real { { float i; //Phan ao Complex a; public: a.r =x.r +r; Complex(float rp= float 0, a.i =x.i +i; ip= 0):Real(rp){ return a; i=ip; } } void Print(){ //tiếp ở hình bên Real::Print(); cout< "+ < < j"< i; }; } };
- Chương trình 4.1 (tiếp và hết) main(){ Real x, y(10.5),z(25.5); x =y.Add(z); cout< "x= x.Print(); < "; cout< endl; < Complex c, d(5,6), e(6,9); c =d.Add(e); cout< "c= c.Print(); < "; cout< endl; < return system("PAUSE"),EXIT_SUCCESS; }
- Kết quả chạy
- Tính đa hình và hàm ảo Khái niệm đa hình: Ta thấy trong chương trình ở trên, trong hàm main có các đối tượng của cả lớp Real và Complex. Các đối tượng này đều có hàm thành viên Print() không có thamsố để in ra nội dung của từng đối tượng. Do đó, khi hàmmain gửi thông báo Print cho các đối tượng, yêu cầu hiển thị nội dung của chúng thì các đối tượng đều gọi hàm Print để in nội dung của chúng ra m hình. Do các đối tượng có các nội àn dung khác nhau nên các nội dung in ra cũng khác nhau. Đây được gọi là sự đa hình, và hàmthành viên giống nhau cho nhiều lớp khác nhau được gọi là hàm đa hình.
- Tính đa hình :a Real Print Print() main() :a Complex Print Print()
- Vấn đề với tính đa hình main(){ Real x(10.5); cout< "x= x.Print(); cout< endl; < "; < Com plex c(6,9); cout< "c= c.Print(); cout< endl; < "; < Real *pr =&x; cout< "x= < ";pr-> Print();cout< endl; < pr= &c; cout< "c= < ";pr-> Print();cout< endl; //Vấn đề ở đây < return system ("PAUSE"),EXIT_SUCCESS; }
- Kết quả chạy
- Vấn đề với tính đa hình Vấn đề nằm ở dòng in ra c =6, tức là chỉ in ra phần thực của c, mặc dù con trỏ pr đã trỏ vào c Nguyên nhân: Do bên trong m đối tượng thuộc lớp Com ỗi plex có 2 hàm Print(), m kế thừa từ lớp Real, và m ột ột được định nghĩa lại trong lớp Com plex, nên khi gọi pr-> Print(), hệ thống đã liên kết và gọi đến hàm Print của lớp Real, vì nó chỉ xét kiểu của con trỏ pr là kiểu Real, chứ không xét đến bản thân kiểu của đối tượng m pr đang trỏ đến. Đây là hình thức liên à kết sớm(early binding), được thực hiện vào lúc
- Giải pháp cho vấn đề đa hình Sử dụng hàm ảo class Real { (virtual) //tiếp từ hình bên Thêm từ khóa virtual Real Add(Real x){ vào khai báo của hàm Real z; Print trong lớp Real z.r =x.r +r; return z; Khi đó hàm Print trong } lớp Com plex cũng là virtual void Print(){ hàmvirtual, m dù ta ặc cout< r; < không cần lặp lại từ } khóa này trong đ/n của }; hàm này
- Kết quả chạy lại
- Hàm ảo và cơ chế liên kết muộn Cơ chế liên kết muộn (late binding) Khi gặp hàm ảo, thì hệ thống không thực hiện liên kết sớmkhi dịch chương trình, m chờ đến khi à chạy chương trình, sau khi xác định rõ kiểu của đối tượng m thi hành hàmđó, thì việc liên kết m à ới được thực hiện, nhằmtìmđúng loại hàmcần thiết để thực hiện.
- Lớp trừu tượng và hàm ảo thuần túy Hàm ảo thuần túy (pure virtual function): Là hàm ảo không có phần định nghĩa (không có phần thân hàm) Lớp trừu tượng (abstract class): Là lớp có ít nhất một hàm thành viên là ảo thuần túy
- Ví dụ Abs class //Đ/n lớp trừu tượng Number class Number { //Khai báo hàm ảo thuần túy virtual Print()=0 public: virtual void Print()=0; }; class Integer: public Number { class Integer class Real public: void Print(); Print() Print() }; class Real: public Number { public: void Print(); };
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Tin học đại cương - Phần 2 Ngôn ngữ lập trình TURBO PASCAL - Chương 1
5 p | 242 | 60
-
Tin học đại cương - Phần 2 Ngôn ngữ lập trình TURBO PASCAL - Chương 2
7 p | 145 | 40
-
Tin học đại cương - Phần 2 Ngôn ngữ lập trình TURBO PASCAL - Chương 4
15 p | 150 | 40
-
Tin học đại cương - Phần 2 Ngôn ngữ lập trình TURBO PASCAL - Chương 3
17 p | 118 | 38
-
Tin học đại cương - Phần 2 Ngôn ngữ lập trình TURBO PASCAL - Chương 5
6 p | 151 | 36
-
Tin học đại cương - Phần 2 Ngôn ngữ lập trình TURBO PASCAL - Chương 6
15 p | 131 | 32
-
Tin học đại cương - Phần 2 Ngôn ngữ lập trình TURBO PASCAL - Chương 7
14 p | 97 | 26
-
PHẦN 2: GIỚI THIỆU VỀ MỘT NGÔN NGỮ LẬP TRÌNH NGÔN NGỮ LẬP TRÌNH C
106 p | 145 | 19
-
Bài giảng Chuyên đề C#: Chương 2 - Ngôn ngữ lập trình C#
300 p | 92 | 16
-
Bài giảng Tin học đại cương - Chương 2: Ngôn ngữ lập trình C
73 p | 49 | 9
-
Bài giảng Ngôn ngữ lập trình C và C++ (Phần 2: Ngôn ngữ C++) - Chương 2: Giới thiệu về ngôn ngữ lập trình C++
49 p | 137 | 7
-
Bài giảng Ngôn ngữ lập trình C và C++ (Phần 2: Ngôn ngữ lập trình C++) - Chương 5: Các lớp nhập/xuất trong C++
19 p | 132 | 7
-
Bài giảng Ngôn ngữ lập trình C và C++ (Phần 2: Ngôn ngữ lập trình C++) - Chương 3: Lớp và đối tượng
52 p | 112 | 5
-
Bài giảng Ngôn ngữ lập trình C và C++ (Phần 2: Ngôn ngữ lập trình C++) - Chương 6: Mẫu (template)
27 p | 85 | 4
-
Giáo trình Lý thuyết ngôn ngữ lập trình (Nghề Lập trình máy tính): Phần 2 - Tổng cục dạy nghề
80 p | 27 | 3
-
Ngôn ngữ lập trình Pascal: Hướng dẫn giải bài tập (Tập 2) - Phần 1
67 p | 13 | 3
-
Ngôn ngữ lập trình Pascal: Hướng dẫn giải bài tập (Tập 2) - Phần 2
72 p | 6 | 3
-
Giáo trình Lập trình căn bản (Ngành: Lập trình máy tính - Trình độ: Trung cấp) - Trường Trung cấp Kinh tế - Kỹ thuật Bình Thuận
122 p | 4 | 1
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