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

Lý thuyết hệ điều hành - Chương 5

Chia sẻ: Nguyễn Nhi | Ngày: | Loại File: PDF | Số trang:36

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

kế thừa Ch-ơng 5 trình bày các vấn đề sau: Đơn kế thừa, đa kế thừa Hàm tạo và hàm hủy đối với sự kế thừa Hàm ảo, lớp cơ sở ảo 5.1. Giới thiệu Kế thừa là một trong các khái niệm cơ sở của ph-ơng pháp lập trình h-ớng đối t-ợng. Tính kế thừa cho phép định nghĩa các lớp mới từ các lớp đã có. Một lớp có thể là lớp cơ sở cho nhiều lớp dẫn xuất khác nhau. Lớp dẫn xuất sẽ kế thừa một số thành phần (dữ liệu và hàm) của lớp...

Chủ đề:
Lưu

Nội dung Text: Lý thuyết hệ điều hành - Chương 5

  1. Ch−¬ng 5 kÕ thõa Ch−¬ng 5 tr×nh bµy c¸c vÊn ®Ò sau: §¬n kÕ thõa, ®a kÕ thõa Hµm t¹o vµ hµm hñy ®èi víi sù kÕ thõa Hµm ¶o, líp c¬ së ¶o 5.1. Giíi thiÖu KÕ thõa lμ mét trong c¸c kh¸i niÖm c¬ së cña ph−¬ng ph¸p lËp tr×nh h−íng ®èi t−îng. TÝnh kÕ thõa cho phÐp ®Þnh nghÜa c¸c líp míi tõ c¸c líp ®· cã. Mét líp cã thÓ lμ líp c¬ së cho nhiÒu líp dÉn xuÊt kh¸c nhau. Líp dÉn xuÊt sÏ kÕ thõa mét sè thμnh phÇn (d÷ liÖu vμ hμm) cña líp c¬ së, ®ång thêi cã thªm nh÷ng thμnh phÇn míi. Cã hai lo¹i kÕ thõa lμ: ®¬n kÕ thõa vμ ®a kÕ thõa, cã thÓ minh häa qua c¸c h×nh vÏ sau ®©y: A B H×nh 5.1. §¬n kÕ thõa, líp A lμ líp c¬ së cña líp B A C A A B B C B C D D (a) (b) (c) H×nh 5.2. §a kÕ thõa H×nh (a): Líp A lμ líp c¬ së cña líp B, líp B lμ líp c¬ së cña líp C H×nh (b): Líp A lμ líp c¬ së cña c¸c líp B, C, D H×nh (c): Líp A, B, C lμ líp c¬ së cña líp D 5.2. §¬n kÕ thõa Lập trình HĐT 93 http://www.ebook.edu.vn
  2. 5.2.1. §Þnh nghÜa líp dÉn xuÊt tõ mét líp c¬ së Gi¶ sö ®· ®Þnh nghÜa líp A. Có ph¸p ®Ó x©y dùng líp B dÉn xuÊt tõ líp A nh− sau: class B: mode A { private: // Khai b¸o c¸c thuéc tÝnh cña líp B public: // §Þnh nghÜa c¸c hμm thμnh phÇn cña líp B }; Trong ®ã mode cã thÓ lμ private hoÆc public víi ý nghÜa nh− sau: - KÕ thõa theo kiÓu public th× tÊt c¶ c¸c thμnh phÇn public cña líp c¬ së còng lμ thμnh phÇn public cña líp dÉn xuÊt. - KÕ thõa theo kiÓu private th× tÊt c¶ c¸c thμnh phÇn public cña líp c¬ së sÏ trë thμnh c¸c thμnh phÇn private cña líp dÉn xuÊt. Chó ý: Trong c¶ hai tr−êng hîp ë trªn th× thμnh phÇn private cña líp c¬ së lμ kh«ng ®−îc kÕ thõa. Nh− vËy trong líp dÉn xuÊt kh«ng cho phÐp truy nhËp ®Õn c¸c thμnh phÇn private cña líp c¬ së. 5.2.2. Truy nhËp c¸c thµnh phÇn trong líp dÉn xuÊt Thμnh phÇn cña líp dÉn xuÊt bao gåm: c¸c thμnh phÇn khai b¸o trong líp dÉn xuÊt vμ c¸c thμnh phÇn mμ líp dÉn xuÊt thõa kÕ tõ c¸c líp c¬ së. Quy t¾c sö dông c¸c thμnh phÇn trong líp dÉn xuÊt ®−îc thùc hiÖn theo theo mÉu nh− sau: Tªn ®èi t−îng.Tªn_líp::Tªn_thμnh_phÇn Khi ®ã ch−¬ng tr×nh dÞch C++ dÔ dμng ph©n biÖt thμnh phÇn thuéc líp nμo. VÝ dô 5.1 Gi¶ sö cã c¸c líp A vμ B nh− sau: class A { public: int n; void nhap() { coutn; } }; Lập trình HĐT 94 http://www.ebook.edu.vn
  3. class B: public A { public: int m; void nhap() { coutm; } }; XÐt khai b¸o: B ob; Lóc ®ã: ob.B::m lμ thuéc tÝnh n khai b¸o trong B ob.A::n lμ thuéc tÝnh n thõa kÕ tõ líp A ob.D::nhap() lμ hμm nhap() ®Þnh nghÜa trong líp B ob.A::nhap() lμ hμm nhap() ®Þnh nghÜa trong líp A Chó ý: §Ó sö dông c¸c thμnh phÇn cña líp dÉn xuÊt, cã thÓ kh«ng dïng tªn líp, chØ dïng tªn thμnh phÇn. Khi ®ã ch−¬ng tr×nh dÞch ph¶i tù ph¸n ®o¸n ®Ó biÕt thμnh phÇn ®ã thuéc líp nμo: tr−íc tiªn xem thμnh phÇn ®ang xÐt cã trïng tªn víi c¸c thμnh phÇn nμo cña líp dÉn xuÊt kh«ng? NÕu trïng th× ®ã thμnh phÇn cña líp dÉn xuÊt. NÕu kh«ng trïng th× tiÕp tôc xÐt c¸c líp c¬ së theo thø tù: c¸c líp cã quan hÖ gÇn víi líp dÉn xuÊt sÏ ®−îc xÐt tr−íc, c¸c líp quan hÖ xa h¬n xÐt sau. Chó ý tr−êng hîp thμnh phÇn ®ang xÐt cã mÆt ®ång thêi trong 2 líp c¬ së cã cïng mét ®¼ng cÊp quan hÖ víi líp dÉn xuÊt. Tr−êng hîp nμy ch−¬ng tr×nh dÞch kh«ng thÓ quyÕt ®Þnh ®−îc thμnh phÇn nμy thõa kÕ tõ líp nμo vμ sÏ ®−a ra mét th«ng b¸o lçi. 5.2.3. §Þnh nghÜa l¹i c¸c hµm thµnh phÇn cña líp c¬ së trong líp dÉn xuÊt Trong líp dÉn xuÊt cã thÓ ®Þnh nghÜa l¹i hμm thμnh phÇn cña líp c¬ së. Nh− vËy cã hai phiªn b¶n kh¸c nhau cña hμm thμnh phÇn trong líp dÉn xuÊt. Trong ph¹m vi líp dÉn xuÊt, hμm ®Þnh nghÜa l¹i “che khuÊt” hμm ®−îc ®Þnh nghÜa. ViÖc sö dông hμm nμo cÇn tu©n theo quy ®Þnh ë trªn. Chó ý: ViÖc ®Þnh nghÜa l¹i hμm thμnh phÇn kh¸c víi ®Þnh nghÜa hμm qu¸ t¶i. Hμm ®Þnh nghÜa l¹i vμ hμm bÞ ®Þnh nghÜa l¹i gièng nhau vÒ tªn, tham sè vμ gi¸ trÞ tr¶ vÒ. Chóng chØ kh¸c nhau vÒ vÞ trÝ: mét hμm ®Æt trong líp dÉn xuÊt vμ hμm kia th× ë trong líp c¬ së. Trong khi ®ã, c¸c hμm qu¸ t¶i chØ cã cïng tªn, nh−ng kh¸c Lập trình HĐT 95 http://www.ebook.edu.vn
  4. nhau vÒ danh s¸ch tham sè vμ tÊt c¶ chóng thuéc cïng mét líp. §Þnh nghÜa l¹i hμm thμnh phÇn chÝnh lμ c¬ së cho viÖc x©y dùng tÝnh ®a h×nh cña c¸c hμm. C++ cho phÐp ®Æt trïng tªn thuéc tÝnh trong c¸c líp c¬ së vμ líp dÉn xuÊt. C¸c thμnh phÇn cïng tªn nμy cã thÓ cïng kiÓu hay kh¸c kiÓu. Lóc nμy bªn trong ®èi t−îng cña líp dÉn xuÊt cã tíi hai thμnh phÇn kh¸c nhau cã cïng tªn, nh−ng trong ph¹m vi líp dÉn xuÊt, tªn chung ®ã nh»m chØ ®Þnh thμnh phÇn ®−îc khai b¸o l¹i trong líp dÉn xuÊt. Khi muèn chØ ®Þnh thμnh phÇn trïng tªn trong líp c¬ së ph¶i dïng tªn líp to¸n tö ‘::’ ®Æt tr−íc tªn hμm thμnh phÇn. VÝ dô 5.2 XÐt c¸c líp A vμ B ®−îc x©y dùng nh− sau: class A { private: int a, b, c; public: void nhap() { couta; coutb; coutc; } void hienthi() { cout
  5. ob.d=10; ob.a = ob.b = ob.c = 5; ob.hienthi(); bëi v× ®èi t−îng ob kh«ng thÓ truy nhËp vμo c¸c thμnh phÇn private cña líp A vμ B. VÝ dô 5.3 Ch−¬ng tr×nh minh häa ®¬n kÕ thõa theo kiÓu public: #include #include class A { int a; //Bien private, khong duoc ke thua public: int b; //Bien public, se duoc ke thua void get_ab(); int get_a(void); void show_a(void); }; class B: public A { int c; public: void mul(void); void display(void); }; void A::get_ab(void) { a = 5; b = 10;} int A::get_a() { return a;} void A::show_a() { cout
  6. cout
  7. coutx; couty; } void hienthi() { cout
  8. Nhap toa do tam va ban kinh hinh tron x=2 y=3 r = 10 Hinh tron co tam: x=2y=3 Co ban kinh = 10 5.2.4. Hµm t¹o ®èi víi tÝnh kÕ thõa C¸c hμm t¹o cña líp c¬ së lμ kh«ng ®−îc kÕ thõa. Mét ®èi t−îng cña líp dÉn xuÊt vÒ thùc chÊt cã thÓ xem lμ mét ®èi t−îng cña líp c¬ së, v× vËy viÖc gäi hμm t¹o líp dÉn xuÊt ®Ó t¹o ®èi t−îng cña líp dÉn xuÊt sÏ kÐo theo viÖc gäi ®Õn mét hμm t¹o cña líp c¬ së. Thø tù thùc hiÖn cña c¸c hμm t¹o sÏ lμ: hμm t¹o cho líp c¬ së, råi ®Õn hμm t¹o cho líp dÉn xuÊt. C++ thùc hiÖn ®iÒu nμy b»ng c¸ch: trong ®Þnh nghÜa cña hμm t¹o líp dÉn xuÊt, ta m« t¶ mét lêi gäi tíi hμm t¹o trong líp c¬ së. Có ph¸p ®Ó truyÒn tham sè tõ líp dÉn xuÊt ®Õn líp c¬ së nh− sau: Tªn_ líp_dÉn_xuÊt(danh s¸ch ®èi):Tªn_ líp_c¬_së (danh s¸ch ®èi) { //th©n hμm t¹o cña líp dÉn xuÊt }; Trong phÇn lín c¸c tr−êng hîp, hμm t¹o cña líp dÉn xuÊt vμ hμm t¹o cña líp c¬ së sÏ kh«ng dïng tham sè gièng nhau. Trong tr−êng hîp cÇn truyÒn mét hay nhiÒu tham sè cho mçi líp, ta ph¶i truyÒn cho hμm t¹o cña líp dÉn xuÊt tÊt c¶ c¸c tham sè mμ c¶ hai líp dÉn xuÊt vμ c¬ së cÇn ®Õn. Sau ®ã, líp dÉn xuÊt chØ truyÒn cho líp c¬ së nh÷ng tham sè nμo mμ líp c¬ së cÇn. VÝ dô 5.5 Ch−¬ng tr×nh sau minh häa c¸ch truyÒn tham sè cho hμm t¹o cña líp c¬ së: #include #include class Diem { private: double x, y; public: Lập trình HĐT 100 http://www.ebook.edu.vn
  9. Diem() { x=y=0.0; } Diem(double x1, double y1) { x=x1; y=y1; } void in() { cout
  10. Hinhtron h(2.5, 3.5, 8); clrscr(); cout
  11. void main() { clrscr(); DX ob; getch(); } Ch−¬ng tr×nh nμy cho kÕt qu¶ nh− sau : Ham tao lop co so Ham tao dan xuat Ham huy lop dan xuat Ham huy lop co so 5.2.6. Khai b¸o protected Ta ®· biÕt c¸c thμnh phÇn khai b¸o private kh«ng ®−îc kÕ thõa trong líp dÉn xuÊt. Cã thÓ gi¶i quyÕt vÊn ®Ò nμy b»ng c¸ch chuyÓn chóng sang vïng public. Tuy nhiªn c¸ch lμm nμy l¹i ph¸ vì nguyªn lý che dÊu th«ng tin cña LTH§T. C++ ®−a ra c¸ch gi¶i quyÕt kh¸c lμ sö dông khai b¸o protected. C¸c thμnh phÇn protected cã ph¹m vi truy nhËp réng h¬n so víi c¸c thμnh phÇn private, nh−ng hÑp h¬n so víi c¸c thμnh phÇn public. C¸c thμnh phÇn protected cña líp c¬ së hoμn toμn gièng c¸c thμnh phÇn private ngo¹i trõ mét ®iÓm lμ chóng cã thÓ kÕ thõa tõ líp dÉn xuÊt trùc tiÕp tõ líp c¬ së. Cô thÓ nh− sau: - NÕu kÕ thõa theo kiÓu public th× c¸c thμnh phÇn proteted cña líp c¬ së sÏ trë thμnh c¸c thμnh phÇn protected cña líp dÉn xuÊt. - NÕu kÕ thõa theo kiÓu private th× c¸c thμnh phÇn proteted cña líp c¬ së sÏ trë thμnh c¸c thμnh phÇn private cña líp dÉn xuÊt. 5.2.7. DÉn xuÊt protected Ngoμi hai kiÓu dÉn xuÊt ®· biÕt lμ private vμ public, C++ cßn ®−a ra kiÓu dÉn xuÊt protected. Trong dÉn xuÊt lo¹i nμy th× c¸c thμnh phÇn public, protected trong líp c¬ së trë thμnh c¸c thμnh phÇn protected trong líp dÉn xuÊt. 5.3. §a kÕ thõa 5.3.1. §Þnh nghÜa líp dÉn xuÊt tõ nhiÒu líp c¬ së Gi¶ sö ®· ®Þnh nghÜa c¸c líp A, B. Có ph¸p ®Ó x©y dùng líp C dÉn xuÊt tõ líp A vμ B nh− sau: class C: mode A, mode B Lập trình HĐT 103 http://www.ebook.edu.vn
  12. { private: // Khai b¸o c¸c thuéc tÝnh public: // C¸c hμm thμnh phÇn }; trong ®ã mode cã thÓ lμ private, public hoÆc protected. ý nghÜa cña kiÓu dÉn xuÊt nμy gièng nh− tr−êng hîp ®¬n kÕ thõa. 5.3.2. Mét sè vÝ dô vÒ ®a kÕ thõa VÝ dô 5.7 Ch−¬ng tr×nh sau minh häa mét líp kÕ thõa tõ hai líp c¬ së: #include #include #include class M { protected : int m; public : void getm(int x) {m=x;} }; class N { protected : int n; public : void getn(int y) {n=y;} }; class P : public M,public N { public : void display(void) { cout
  13. } }; void main() { P ob; clrscr(); ob.getm(10); ob.getn(20); ob.display(); getch(); } Ch−¬ng tr×nh cho kÕt qu¶ nh− sau: m = 10 n = 20 m*n = 200 VÝ dô 5.8 Ch−¬ng tr×nh sau minh häa viÖc qu¶n lý kÕt qu¶ thi cña mét líp kh«ng qu¸ 100 sinh viªn. Ch−¬ng tr×nh gåm 3 líp: líp c¬ së sinh viªn (sinhvien) chØ l−u hä tªn vμ sè b¸o danh, líp ®iÓm thi (diemthi) kÕ thõa líp sinh viªn vμ l−u kÕt qu¶ m«n thi 1 vμ m«n thi 2. Líp kÕt qu¶ (ketqua) l−u tæng sè ®iÓm ®¹t ®−îc cña sinh viªn. #include #include #include class sinhvien { char hoten[25]; protected: int sbd; public: void nhap() { cout
  14. cout
  15. for(i=0;i
  16. } void hienthi_diem() { cout
  17. sv[i].nhap_diem(); sv[i].nhap_ut(); } for(i=0;i
  18. } void show() { cout
  19. cout
  20. } }; class C : public B { public: void xuat() { cout xuat(); r->xuat(); C¶ 3 c©u lÖnh trªn ®Òu gäi tíi hμm thμnh phÇn xuat() cña líp A, bëi v× c¸c con trá p, q, r ®Òu cã kiÓu líp A. Së dÜ nh− vËy lμ v× mét lêi gäi (xuÊt ph¸t tõ mét ®èi t−îng hay con trá) tíi hμm thμnh phÇn lu«n lu«n liªn kÕt víi mét hµm thµnh phÇn cè ®Þnh vμ sù liªn kÕt nμy x¸c ®Þnh trong qu¸ tr×nh biªn dÞch ch−¬ng tr×nh. Ta b¶o ®©y lμ sù liªn kÕt tÜnh. Lập trình HĐT 112 http://www.ebook.edu.vn
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

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