Xem mẫu

  1. ch­¬ng 5 DÉn xuÊt vµ thõa kÕ Cã 2 kh¸i niÖm rÊt quan träng ®· lµm nªn toµn bé thÕ m¹nh cña ph­¬ng ph¸p lËp tr×nh h­íng ®èi t­îng ®ã lµ tÝnh kÕ thõa (inheritance) vµ tÝnh t­¬ng øng béi (polymorphism). TÝnh kÕ thõa cho phÐp c¸c líp ®­îc x©y dùng trªn c¸c líp ®· cã. Trong ch­¬ng nµy sÏ nãi vÒ sù thõa kÕ cña c¸c líp. § 1. Sù dÉn xuÊt vµ tÝnh thõa kÕ 1.1. Líp c¬ së vµ líp dÉn xuÊt Mét líp ®­îc x©y dùng thõa kÕ mét líp kh¸c gäi lµ líp dÉn xuÊt. Líp dïng ®Ó x©y dùng líp dÉn xuÊt gä i lµ líp c¬ së. Líp nµo còng cã thÓ lµ mét líp c¬ së. H¬n thÕ n÷a, mét líp cã thÓ lµ c¬ së cho nhiÒu líp dÉn xuÊt kh¸c nhau. §Õn l­ît m×nh, líp dÉn xuÊt l¹i cã thÓ dïng lµm c¬ së ®Ó x©y dùng c¸c líp d©n xuÊt kh¸c. Ngoµi ra mét líp cã thÓ dÉn xuÊt tõ nhiÒu líp c¬ së. D­íi ®©y lµ mét sè s¬ ®å vÒ quan hÖ dÉn xuÊt cña c¸c líp: S¬ ®å 1: Líp B dÉn xuÊt tõ líp A, líp C dÉn xuÊt tõ líp B A B C 237 238
  2. S¬ ®å 2: Líp A lµ c¬ së cña c¸c líp B, C vµ D A B C D S¬ ®å 3: Líp D dÉn xuÊt tõ 3 líp A, B, C A B C D S¬ ®å 4: L­îc ®å dÉn xuÊt tæng qu¸t A B C D E F G H TÝnh thõa kÕ: Mét líp dÉn xuÊt ngoµi c¸c thµnh phÇn cña riªng nã, nã cßn ®­îc thõa kÕ tÊt c¶ c¸c thµnh phÇn cña c¸c líp c¬ së cã liªn quan. VÝ dô trong s¬ ®å 1 th× líp C ®­îc thõa kÕ c¸c thµnh phÇn cña c¸c líp B vµ A. Trong s¬ ®å 3 th× líp D ®­îc thõa kÕ c¸c thµnh phÇn cña c¸c líp A, B vµ C. Trong s¬ ®å 4 th× líp G ®­îc thõa kÕ c¸c thµnh phÇn cña c¸c líp D, E, A, B vµ C. 1.2. C¸ch x©y dùng líp d©n xuÊt Gi¶ sö ®· ®Þnh nghÜa c¸c líp A vµ B. §Ó x©y dùng líp C d©n xuÊt tõ A vµ B, ta viÕt nh­ sau: class C : public A, public B
  3. { private: // Khai b¸o c¸c thuéc tÝnh public: // C¸c ph­¬ng thøc }; 1.3. Thõa kÕ private vµ public Trong vÝ dô trªn, líp C thõa kÕ public c¸c líp A vµ B. NÕu thay tõ kho¸ public b»ng private, th× sù thõa kÕ lµ private. Chó ý: NÕu bá qua kh«ng dïng tõ kho¸ th× hiÓu lµ private, vÝ dô nÕu ®Þnh nghÜa: class C : public A, B { private: // Khai b¸o c¸c thuéc tÝnh public: // C¸c ph­¬ng thøc }; th× A lµ líp c¬ së public cña C , cßn B lµ líp c¬ së private cña C. Theo kiÓu thõa kÕ public th× tÊt c¶ c¸c thµnh phÇn public cña líp c¬ së còng lµ c¸c thµnh phÇn publi c cña líp dÉn xuÊt. Theo kiÓu thõa kÕ 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. 1.4. Thõa kÕ c¸c thµnh phÇn d÷ liÖu (thuéc tÝnh) C¸c thuéc tÝnh cña líp c¬ së ®­îc thõa kÕ trong líp dÉn xuÊt. Nh­ vËy tËp thuéc tÝnh cña líp dÉn xuÊ t sÏ gåm: c¸c thuéc tÝnh míi khai b¸o trong ®Þnh nghÜa líp dÉn xuÊt vµ c¸c thuéc tÝnh cña líp c¬ së.
  4. Tuy vËy trong líp dÉn xuÊt kh«ng cho phÐp truy nhËp ®Õn c¸c thuéc tÝnh private cña líp c¬ së. Chó ý: 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. VÝ dô: class A 239 240 { private: int a, b, c; public: ... }; class B { private: double a, b, x; public: ... }; class C : public A, B { private: char *a , *x ; int b ; public: ... }; Khi ®ã líp C sÏ cã c¸c thuéc tÝnh:
  5. A::a , A::b, A::c (kiÓu int) - thõa kÕ tõ A B::a , B::b, B::x (kiÓu double) - thõa kÕ tõ B a, x (kiÓu char*) vµ b (kiÓu int) - khai b¸o trong C Trong c¸c ph­¬ng thøc cña C chØ cho phÐp truy nhËp trùc tiÕp tíi c¸c thuéc tÝnh khai b¸o trong C. 1.5. Thõa kÕ ph­¬ng thøc Trõ: + Hµm t¹o + Hµm huû + To¸n tö g¸n c¸c ph­¬ng thøc (public) kh¸c cña líp c¬ së ®­îc thõa kÕ trong líp dÉn xuÊt. VÝ dô: Trong ch­¬ng tr×nh d­íi ®©y: + §Çu tiªn ®Þnh nghÜa líp DIEM cã: C¸c thuéc tÝnh x, y Hai hµm t¹o Ph­¬ng thøc in() + Sau ®ã x©y dùng líp HINH_TRON dÉn xuÊt tõ líp DIEM, ®­a thªm: Thuéc tÝnh r Hai hµm t¹o Ph­¬ng thøc getR Chó ý c¸ch dïng hµm t¹o cña líp c¬ së (líp DIEM) ®Ó x©y dùng hµm t¹o cña líp dÉn xuÊt. + Trong hµm main: Khai b¸o ®èi t­îng h kiÓu HINH_TRON Sö dông ph­¬ng thøc in() ®èi víi h (sù thõa kÕ) Sö dông ph­¬ng thøc getR ®èi víi h //CT5-01
  6. // Lop co so #include #include class DIEM 241 242 { private: double x, y; public: DIEM() { x = y =0.0; } DIEM(double x1, double y1) { x = x1; y = y1; } void in() { cout
  7. HINH_TRON() { r = 0.0; } HINH_TRON(double x1, double y1, double r1): DIEM(x1,y1) { r = r1; } double getR() { return r; } }; void main() { HINH_TRON h(2.5,3.5,8); clrscr(); cout
  8. Líp c¬ së th­êng ®­îc xö lý gièng nh­ mét thµnh phÇn kiÓu ®èi t­îng cña líp dÉn xuÊt. VÝ dô ch­¬ng t r×nh trong 1.5 cã thÓ thay b»ng mét ch­¬ng tr×nh kh¸c trong ®ã thay viÖc dïng líp c¬ së DIEM b»ng mét thµnh phÇn kiÓu DIEM trong líp HINH_TRON. Ch­¬ng tr×nh míi cã thÓ viÕt nh­ sau: //CT5-02 // Lop co doi tuong thanh phan #include #include class DIEM { private: 243 244 double x, y; public: DIEM() { x = y =0.0; } DIEM (double x1, double y1) { x = x1; y = y1; } void in() { cout
  9. { private: DIEM d; double r; public: HINH_TRON() : d() { r = 0.0; } HINH_TRON(double x1, double y1, double r1): d(x1,y1) { r = r1; } void in() { d.in(); } double getR() { return r; } }; void main() { HINH_TRON h(2.5,3.5,8); clrscr(); cout
  10. h.in(); cout
  11. Khi mét ®èi t­îng cña líp dÉn xuÊt ®­îc gi¶i phãng (bÞ huû), th× c¸c ®èi t­îng thµnh phÇn vµ c¸c ®èi t­îng thõa kÕ tõ c¸c líp c¬ së còng bÞ gi¶i phãng theo. Do ®ã c¸c hµm huû t­¬ng øng sÏ ®­îc gäi ®Õn. Nh­ vËy khi x©y dùng hµm huû cña líp dÉn xuÊt, chóng ta chØ cÇn quan t©m ®Õn c¸c thuéc tÝnh (kh«ng p h¶i lµ ®èi t­îng) khai b¸o thªm trong líp dÉn xuÊt mµ th«i. Ta kh«ng cÇn ®Ó ý ®Õn c¸c ®èi t­îng thµnh p hÇn vµ c¸c thuéc tÝnh thõa kÕ tõ c¸c líp c¬ së. (xem vÝ dô môc 2.4 vµ §6, vÝ dô 2) 2.4. VÝ dô xÐt c¸c líp + Líp NGUOI gåm: - C¸c thuéc tÝnh char *ht ; // Hä tªn int ns ; - Hai hµm t¹o, ph­¬ng thøc in() vµ hµm huû + Líp MON_HOC gåm: - C¸c thuéc tÝnh char *monhoc ; // Tªn m«n häc int st ; // Sè tiÕt - Hai hµm t¹o, ph­¬ng thøc in() vµ hµm huû + Líp GIAO_VIEN : - KÕ thõa tõ líp NGUOI - §­a thªm c¸c thuéc tÝnh char *bomon ; // Bé m«n c«ng t¸c MON_HOC mh ; // M«n häc ®ang dËy - Hai hµm t¹o , ph­¬ng thøc in() vµ hµm huû H·y ®Ó ý c¸ch x©y dùng c¸c hµm t¹o, hµm huû cña líp dÉn xuÊt GIAO_VIEN. Trong líp GIAO_VIEN cã thÓ g äi tíi 2 ph­¬ng thøc in(): GIAO_VIEN::in() // §­îc x©y dùng trong líp GIAO_VIEN
  12. NGUOI::in() // Thõa kÕ tõ líp NGUOI H·y chó ý c¸ch gäi tíi 2 ph­¬ng thøc in() trong ch­¬ng tr×nh d­íi ®©y. //CT5-03 // Ham tao cua lop dan suat #include #include #include class MON_HOC { private: char *monhoc; 247 248 int st; public: MON_HOC() { monhoc=NULL; st=0; } MON_HOC(char *monhoc1, int st1) { int n = strlen(monhoc1); monhoc = new char[n+1]; strcpy(monhoc,monhoc1); st=st1; } ~ MON_HOC()
  13. { if (monhoc!=NULL) { delete monhoc; st=0; } } void in() { cout
  14. strcpy(ht,ht1); ns=ns1; } ~NGUOI() { if (ht!=NULL) { delete ht; ns=0; } } void in() { cout
  15. GIAO_VIEN(char *ht1, int ns1, char *monhoc1,int st1, char *bomon1 ): NGUOI(ht1,ns1),mh(monhoc1, st1) { int n = strlen(bomon1); bomon = new char[n+1]; strcpy(bomon,bomon1); } ~GIAO_VIEN() { if (bomon!=NULL) delete bomon; } void in() { // Su dung phuong thuc in NGUOI::in(); cout
  16. 60, "TIN HOC"); g2->in(); /* co the viet g2->GIAO_VIEN::in(); */ g2->NGUOI::in(); getch(); delete g2; // Goi toi cac ham huy getch(); } § 3. Ph¹m vi truy nhËp ®Õn c¸c thµnh phÇn cña líp c¬ së 3.1. C¸c tõ kho¸ quy ®Þnh ph¹m vi truy nhËp cña líp c¬ së + MÆc dï líp dÉn xuÊt ®­îc thõa kÕ tÊt c¶ c¸c thµnh phÇn cña líp c¬ së, nh­ng trong líp dÉn xuÊt kh« ng thÓ truy nhËp tíi tÊt c¶ c¸c thµnh phÇn nµy. Gi¶i ph¸p th­êng dïng lµ sö dông c¸c ph­¬ng thøc cña líp cë së ®Ó truy nhËp ®Õn c¸c thuéc tÝnh cña chÝnh líp c¬ së ®ã. Còng cã thÓ sö dông c¸c gi¶i ph¸p kh¸c d­íi ®©y. + C¸c thµnh phÇn private cña líp cë së kh«ng cho phÐp truy nhËp trong líp dÉn xuÊt. + C¸c thµnh phÇn public cña líp c¬ së cã thÓ truy nhËp bÊt kú chç nµo trong ch­¬ng tr×nh. Nh­ vËy tr ong c¸c líp dÉn xuÊt cã thÓ truy nhËp ®­îc tíi c¸c thµnh phÇn nµy. + C¸c thµnh phÇn khai b¸o lµ protected cã ph¹m vi truy nhËp réng h¬n so víi c¸c thµnh phÇn private, nh­ng 251 252 hÑp h¬n so víi c¸c thµnh phÇn public. C¸c thµnh phÇn protected cña mét líp chØ ®­îc më réng ph¹m vi truy nhËp cho c¸c líp dÉn xuÊt trùc tiÕp tõ líp nµy. 3.2. Hai kiÓu dÉn xuÊt Cã 2 kiÓu dÉn xuÊt lµ private vµ public, chóng cho c¸c ph¹m vi truy nhËp kh¸c nhau tíi líp c¬ së. Cô thÓ nh­ sau:
  17. + C¸c thµnh phÇn public vµ protected cña líp c¬ së sÏ trë thµnh c¸c thµnh phÇn public vµ protected c ña líp dÉn xuÊt theo kiÓu public. + C¸c thµnh phÇn public vµ protected 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 theo kiÓu private. VÝ dô : Gi¶ sö líp A cã: thuéc tÝnh public a1 thuéc tÝnh protected a2 vµ líp B dÉn xuÊt public tõ A, th× A::a1 trë thµnh public trong B, A::a2 trë thµnh protected trong B. Do ®ã nÕu dïng B lµm líp cë ®Ó x©y dùng líp C. Th× trong C cã thÓ truy nhËp tíi A::a1 vµ A::a2. ThÕ nh­ng nÕu söa ®æi ®Ó B dÉn xuÊt private tõ A, th× c¶ A::a1 vµ A::a2 tr¬ thµnh private trong B, v µ khi ®ã trong C kh«ng ®­îc phÐp truy nhËp tíi c¸c thuéc tÝnh A::a1 vµ A::a2. §Ó biÕt t­êng tËn h¬n, chóng ta h·y biªn dÞch ch­¬ng tr×nh: //CT5-04 // Pham vi truy nhap #include #include #include class A { protected: int a1; public: int a2; A() { a1=a2=0;
  18. } A(int t1, int t2) { a1=t1; a2= t2; } void in() { cout
  19. { cout
  20. getch(); } Chóng ta sÏ nhËn ®­îc 4 th«ng b¸o lçi sau trong líp C (t¹i hµm t¹o cã ®èi vµ ph­¬ng thøc in): A::a1 is not accessible A::a2 is not accessible A::a1 is not accessible A::a2 is not accessible B©y giê nÕu söa ®æi ®Ó líp B dÉn xuÊt public tõ A th× ch­¬ng tr×nh sÏ kh«ng cã lçi vµ lµm viÖc tèt. § 4. Thõa kÕ nhiÒu møc vµ sù trïng tªn 4.1. S¬ ®å x©y dùng c¸c líp dÉn xuÊt theo nhiÒu møc Nh­ ®· biÕt: + Khi ®· ®Þnh nghÜa mét líp (vÝ dô líp A), ta cã thÓ dïng nã lµm c¬ së ®Ó x©y dùng líp dÉn xuÊt (vÝ dô B). + §Õn l­ît m×nh, B cã thÓ dïng lµm c¬ së ®Ó x©y dùng líp dÉn xuÊt míi (vÝ dô C). + TiÕp ®ã l¹i cã thÓ dïng C lµm c¬ së ®Ó x©y dùng líp dÉn xuÊt míi. + Sù tiÕp tôc theo c¸ch trªn lµ kh«ng h¹n chÕ. S¬ ®å trªn chÝnh lµ sù thõa kÕ nhiÒu møc. Ngoµi ra chóng ta còng ®· biÕt: + Mét líp cã thÓ ®­îc dÉn xuÊt tõ nhiÒu líp c¬ së. + Mét líp cã thÓ dïng lµm c¬ së cho nhiÒu líp. H×nh vÏ d­íi ®©y lµ mét vÝ dô vÒ s¬ ®å thõa kÕ kh¸ tæng qu¸t, thÓ hiÖn ®­îc c¸c ®iÒu nãi trªn: A B C 255 256 D E
nguon tai.lieu . vn