intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Phần 2: Ngôn ngữ lập trình C++ - Chương 4: Kế thừa

Chia sẻ: Nguyen Van Phong | Ngày: | Loại File: PPT | Số trang:25

93
lượt xem
12
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

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

Chủ đề:
Lưu

Nội dung Text: Phần 2: Ngôn ngữ lập trình C++ - Chương 4: Kế thừa

  1. Phần 2: Ngôn ngữ lập trình C++ Chương 4: Kế thừa
  2. 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
  3. 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)
  4. 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 +, ­, *, / +, ­, *, / ,==,… ,==,…
  5. 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
  6. 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 };
  7. 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; < }; } };
  8. 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; }; } };
  9. 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; }
  10. Kết quả chạy
  11. 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.
  12. Tính đa hình :a Real Print Print() main() :a Complex Print Print()
  13. 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; }
  14. Kết quả chạy
  15. 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
  16. 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
  17. Kết quả chạy lại
  18. 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.
  19. 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
  20. 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(); };
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
3=>0