Ngôn ngữ lập trình - Chương 4 (HUST)

LI
lienhejb
0 téléchargements
25
0

Contenu du document

Page 1

goupee.vn goupee.com Phần 2: Ngôn ngữ lập trình C++ Chương 4: Kế thừa cuu duong than cong . com fb.com/goupee.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt

Page 2

goupee.vnCác nội dung chính goupee.com  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 cuu duong than cong . com fb.com/goupee.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt

Page 3

goupee.vnCác khái niệm cơ bản goupee.com  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ở) cuu duong than cong . comB Lớp con (lớp dẫn xuất) fb.com/goupee.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt

Page 4

goupee.vnVí dụ về sự kế thừa goupee.com 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ốcuu duong than cong . comLớp Số Phức Giá trị mẫu số Giá trị phức +, -, *, / +, -, *, / <,>,==,… <,>,==,… fb.com/goupee.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt

Page 5

goupee.vnPhân loại kế thừa goupee.com  Có hai cách phân loại  Theo mức độ kế thừa: có 2 mức  Public: bảo toàn mức độ che dấu của các thành phần của lớp cơ sở trong lớp dẫn xuất  Private: đưa các mức che dấu của các thành phần trong lớp cơ sở lên mức private trong lớp dẫn xuất  Theo số lượng lớp cơ sở: có 2 loại  Kế thừa đơn  Kế thừa bộicuu duong than cong . com fb.com/goupee.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt

Page 6

goupee.vnCú pháp khai báo kế thừa goupee.com  Kế thừa đơn  Trong đó E có thể class B: <E> A { là: //Đ/n phần thân của lớp dẫn xuất };  public  private  Kế thừa bội class C: <E > A, <E > B { A B //Đ/n phần thân của lớp dẫn xuất cuu duong than cong . com}; fb.com/goupee.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt

Page 7

goupee.vnKế thừa đơn goupee.com  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; } } cuu duong than cong . comvoid Print(){ //tiếp ở hình bên cout<<r; }; } }; fb.com/goupee.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt

Page 8

goupee.vnChương trình 4.1 (tiếp) goupee.com class Complex: public Real { class Complex: public //tiếp từ hình bên Real { Complex Add(Complex float i; //Phan ao x){ public: Complex a; Complex(float rp=0, float a.r = x.r +r; ip=0):Real(rp){ a.i = x.i +i; i=ip; return a; } } //tiếp ở hình bên void Print(){ cuu duong than cong . comReal::Print(); }; cout<<"+j"<<i; } }; fb.com/goupee.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt

Page 9

goupee.vnChương trình 4.1 (tiếp và hết) goupee.com 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; returncuu duong than cong . com system("PAUSE"),EXIT_SUCCESS; } fb.com/goupee.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt

Page 10

goupee.vnKết quả chạy goupee.com cuu duong than cong . com fb.com/goupee.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt

Page 11

goupee.vnTính đa hình và hàm ảo goupee.com  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ó tham số để in ra nội dung của từng đối tượng. Do đó, khi hàm main 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àn hình. Do các đối tượng có các nộicuu duong than cong . com 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àm thành viên giống nhau cho nhiều lớp khác nhau được gọi là hàm đa hình. fb.com/goupee.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt

Page 12

goupee.vnTính đa hình goupee.com :a Real Print Print() main() :a Print Complex Print() cuu duong than cong . com fb.com/goupee.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt

Page 13

goupee.vnVấn đề với tính đa hình goupee.com main(){ Real x(10.5); cout<<"x="; x.Print(); cout<<endl; Complex 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;cuu duong than cong . com } fb.com/goupee.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt

Page 14

goupee.vnKết quả chạy goupee.com cuu duong than cong . com fb.com/goupee.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt

Page 15

goupee.vnVấn đề với tính đa hình goupee.com  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 đối tượng thuộc lớp Complex có 2 hàm Print(), một kế thừa từ lớp Real, và một được định nghĩa lại trong lớp Complex, 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ượngcuu duong than cong . com 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 dịch chương trình fb.com/goupee.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt

Page 16

goupee.vnGiải pháp cho vấn đề đa hình goupee.com  Sử dụng hàm ảo (virtual) class Real {  Thêm từ khóa virtual //tiếp từ hình bên vào khai báo của hàm Real Add(Real x){ Real z; Print trong lớp Real z.r = x.r +r;  Khi đó hàm Print trong return z; lớp Complex cũng là } virtual void Print(){ hàm virtual, mặc dù ta cout<<r; không cần lặp lại từcuu duong than cong . com} khóa này trong đ/n của }; hàm này fb.com/goupee.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt

Page 17

goupee.vnKết quả chạy lại goupee.com cuu duong than cong . com fb.com/goupee.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt

Page 18

goupee.vnHàm ảo và cơ chế liên kết muộngoupee.com  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ớm khi 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ằm tìm đúng loại hàm cần thiết để thực hiện. cuu duong than cong . com fb.com/goupee.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt

Page 19

goupee.vnLớp trừu tượng và hàm ảo thuần túygoupee.com  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 cuu duong than cong . com fb.com/goupee.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt

Page 20

goupee.vnVí dụ goupee.com Abs class //Đ/n lớp trừu tượng Number class Number { virtual //Khai báo hàm ảo thuần túy Print()=0 public: virtual void Print()=0; }; class Integer class Real class Integer: public Number { public: Print() Print() void Print(); }; class Real: public Number { cuu duong than cong . compublic: void Print(); }; fb.com/goupee.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt

Affichage des 20 premières pages. Téléchargez le document pour le voir en entier.

Commentaires (0)

Se connecter pour rejoindre la discussion

Aucun commentaire pour le moment. Soyez le premier !