Xem mẫu

  1. LËp tr×nh h-íng ®èi t-îng Ch-¬ng 3: DÉn xuÊt vµ thõa kÕ Néi dung cña ch-¬ng tËp trung tr×nh bµy c¸c vÊn ®Ò sau:  Kh¸i niÖm líp c¬ së, líp dÉn xuÊt.  C¸ch x©y dùng líp dÉn xuÊt.  C¸c kiÓu thõa kÕ.  Ph¹m vi truy xuÊt ®Õn c¸c thµnh phÇn cña líp c¬ së.  Hµm t¹o, hµm huû, to¸n tö g¸n víi tÝnh thõa kÕ  Thõa kÕ nhiÒu møc vµ sù trïng tªn.  Líp c¬ së ¶o.  Ph-¬ng thøc tÜnh, ph-¬ng thøc ¶o. 3.1. Sù dÉn xuÊt vµ tÝnh thõa kÕ 3.1.1. Líp c¬ së vµ líp dÉn xuÊt LËp tr×nh h-íng ®èi t-îng cã hai ®Æc tr-ng c¬ b¶n:  §ãng gãi d÷ liÖu, ®-îc thÓ hiÖn b»ng c¸ch dïng kh¸i niÖm líp ®Ó biÓu diÔn ®èi t-îng víi c¸c thuéc tÝnh private, chØ cho phÐp bªn ngoµi truy nhËp vµo th«ng qua c¸c ph-¬ng thøc.  Dïng l¹i m·, thÓ hiÖn b»ng viÖc thõa kÕ gi÷a c¸c líp. ViÖc thõa kÕ cho phÐp c¸c líp thõa kÕ (gäi lµ líp dÉn xuÊt) sö dông l¹i c¸c ph-¬ng thøc ®· ®-îc ®Þnh nghÜa trong c¸c líp gèc (gäi lµ líp c¬ së). Mét líp cã thÓ ®-îc dÉn xuÊt tõ nhiÒu líp c¬ së, mét líp c¬ së còng cã thÓ lµ líp c¬ së cña nhiÒu líp dÉn xuÊt. 3.1.2. C¸ch x©y dùng líp dÉn xuÊt Có ph¸p khai b¸o mét líp thõa kÕ tõ mét líp kh¸c nh- sau: class : { …// Khai b¸o c¸c thµnh phÇn cña líp }; Trong ®ã: Trang - 88 -
  2. LËp tr×nh h-íng ®èi t-îng Tªn líp dÉn xuÊt: lµ tªn líp ®-îc cho thõa kÕ tõ líp kh¸c. Tªn líp nµy tu©n thñ theo quy t¾c ®Æt tªn biÕn trong C++. Tªn líp cë së: lµ tªn líp ®· ®-îc ®Þnh nghÜa tr-íc ®ã ®Ó cho líp kh¸c thõa kÕ. Tªn líp nµy còng tu©n thñ theo quy t¾c ®Æt tªn biÕn cña C++. Tõ khãa dÉn xuÊt: lµ tõ khãa quy ®Þnh tÝnh chÊt cña sù thõa kÕ. Cã ba tõ khãa dÉn xuÊt lµ private, protected vµ public. VÝ dô 3.1: class Bus: public Car { …// Khai b¸o c¸c thµnh phÇn }; lµ khai b¸o mét líp Bus (xe buýt) thõa kÕ tõ líp Car (xe « t«) víi tÝnh chÊt thõa kÕ lµ public. 3.1.3. C¸c kiÓu thõa kÕ Sù thõa kÕ cho phÐp trong líp dÉn xuÊt cã thÓ sö dông l¹i mét sè m· nguån cña c¸c ph-¬ng thøc vµ thuéc tÝnh ®· ®-îc ®Þnh nghÜa trong líp c¬ së. NghÜa lµ líp dÉn xuÊt cã thÓ truy nhËp trùc tiÕp ®Õn mét sè thµnh phÇn cña líp c¬ së. Tuy nhiªn, ph¹m vi truy nhËp tõ líp dÉn xuÊt ®Õn líp c¬ së kh«ng ph¶i bao giê còng gièng nhau: chóng ®-îc quy ®Þnh bëi c¸c tõ khãa dÉn xuÊt private, protected vµ public. Thõa kÕ private Theo kiÓu thõa kÕ nµy: C¸c thµnh phÇn private cña líp c¬ së th× kh«ng thÓ truy nhËp ®-îc tõ líp dÉn xuÊt. C¸c thµnh phÇn protected cña líp c¬ së trë thµnh c¸c thµnh phÇn private cña líp dÉn xuÊt. C¸c thµnh phÇn public cña líp c¬ së còng trë thµnh c¸c thµnh phÇn private cña líp dÉn xuÊt. Ph¹m vi truy nhËp tõ bªn ngoµi vµo líp dÉn xuÊt ®-îc tu©n thñ nh- quy t¾c ph¹m vi líp th«ng th-êng. Thõa kÕ protected Theo kiÓu thõa kÕ nµy: Trang - 89 -
  3. LËp tr×nh h-íng ®èi t-îng C¸c thµnh phÇn private cña líp c¬ së th× kh«ng thÓ truy nhËp ®-îc tõ líp dÉn xuÊt. C¸c thµnh phÇn protected cña líp c¬ së trë thµnh c¸c thµnh phÇn protected cña líp dÉn xuÊt. C¸c thµnh phÇn public cña líp c¬ së còng trë thµnh c¸c thµnh phÇn protected cña líp dÉn xuÊt. Ph¹m vi truy nhËp tõ bªn ngoµi vµo líp dÉn xuÊt ®-îc tu©n thñ nh- quy t¾c ph¹m vi líp th«ng th-êng. Thõa kÕ public Theo kiÓu thõa kÕ nµy: C¸c thµnh phÇn private cña líp c¬ së th× kh«ng thÓ truy nhËp ®-îc tõ líp dÉn xuÊt. C¸c thµnh phÇn protected cña líp c¬ së trë thµnh c¸c thµnh phÇn protected cña líp dÉn xuÊt. C¸c thµnh phÇn public cña líp c¬ së vÉn lµ c¸c thµnh phÇn public cña líp dÉn xuÊt. Ph¹m vi truy nhËp tõ bªn ngoµi vµo líp dÉn xuÊt ®-îc tu©n thñ nh- quy t¾c ph¹m vi líp th«ng th-êng. 3.1.4. Thõa kÕ c¸c thµnh phÇn d÷ liÖu 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 trong líp dÉn xuÊt sÏ bao gåm: c¸c thuéc tÝnh míi khai b¸o trong líp dÉn xuÊt vµ c¸c thuéc tÝnh mµ líp dÉn xuÊt ®-îc thõa kÕ tõ c¸c líp c¬ së cã liªn quan. Tuy vËy, trong c¸c ph-¬ng thøc cña líp dÉn xuÊt kh«ng ®-îc phÐp truy nhËp vµo c¸c thuéc tÝnh private cña líp c¬ së. Tªn cña thuéc tÝnh trong líp dÉn xuÊt vµ trong líp c¬ së cã thÓ ®Æt trïng nhau. VÝ dô 3.2: class Sinhvien { private: char *MaSV; char *TenSV; char *Diachi; char *Gioitinh; Trang - 90 -
  4. LËp tr×nh h-íng ®èi t-îng float DiemToanCC; float DiemVatly; float DiemAnhvan; public: void nhap(); void hienthi(); }; class SinhvienCNTT:Sinhvien { private: float DiemLTC; float DiemCSDL; public: void nhap(); void hienthi(); int Xet_hocbong(); }; Khi ®ã líp SinhvienCNTT ngoµi c¸c thuéc tÝnh DiemLTC, DiemCSDL cßn cã c¸c thuéc tÝnh: MaSV, TenSV, Diachi, Gioitinh, DiemToanCC, DiemVatly, DiemAnhvan ®-îc thõa kÕ tõ líp Sinhvien. 3.1.5. Thõa kÕ ph-¬ng thøc Trõ: Hµm t¹o, hµm huû vµ 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. Tªn c¸c ph-¬ng thøc cña líp dÉn xuÊt vµ líp c¬ së cã thÓ ®Æt trïng nhau. VÝ dô 3.3: #include #include #include #include #include #define MAX_TEN 50 #define MAX_MASO 5 #define MUC_CO_BAN 830000 Trang - 91 -
  5. LËp tr×nh h-íng ®èi t-îng class Nguoi { protected: char HoTen[MAX_TEN]; char MaSo[MAX_MASO]; float Luong; public: Nguoi(); void Xuat(); void Nhap(); virtual void TinhLuong()=0; }; Nguoi::Nguoi() { strcpy(HoTen,""); strcpy(MaSo,""); Luong=0; } void Nguoi::Xuat() { cout
  6. LËp tr×nh h-íng ®èi t-îng { protected: float HeSoLuong; float HeSoPhuCap; public: BienChe(); void TinhLuong(); void Nhap(); }; BienChe::BienChe() { HeSoLuong=HeSoPhuCap=0; } void BienChe::Nhap() { Nguoi::Nhap(); coutHeSoLuong; coutHeSoPhuCap; } void BienChe::TinhLuong() { Luong=MUC_CO_BAN*(1.0+HeSoLuong+HeSoPhuCap); } class HopDong : public Nguoi { protected: float TienCong; float NgayCong; float HeSoVuotGio; public: HopDong(); Trang - 93 -
  7. LËp tr×nh h-íng ®èi t-îng void TinhLuong(); void Nhap(); }; HopDong::HopDong() { TienCong=NgayCong=HeSoVuotGio=0; } void HopDong::Nhap() { Nguoi::Nhap(); coutTienCong; coutNgayCong; coutHeSoVuotGio; } void HopDong::TinhLuong() { Luong=TienCong*NgayCong*(1+HeSoVuotGio); } int main() { Nguoi *Ng[100]; int N=0; char Chon,Loai; clrscr(); do { coutLoai; Loai=toupper(Loai); if (Loai=='B') Trang - 94 -
  8. LËp tr×nh h-íng ®èi t-îng Ng[N]=new BienChe; else Ng[N]=new HopDong; Ng[N++]->Nhap(); coutChon; Chon=toupper(Chon); if ((N==100)||(Chon=='K')) break; }while (1); for(int I=0;ITinhLuong(); Ng[I]->Xuat(); } return 0; } 3.2. Hµm t¹o vµ hµm huû ®èi víi tÝnh thõa kÕ 3.2.1. X©y dùng hµm t¹o cña líp dÉn xuÊt Khi khai b¸o mét ®èi t-îng cã kiÓu líp ®-îc dÉn xuÊt tõ mét líp c¬ së kh¸c. Ch-¬ng tr×nh sÏ tù ®éng gäi tíi hµm t¹o cña líp dÉn xuÊt. Tuy nhiªn, thø tù ®-îc gäi sÏ b¾t ®Çu tõ hµm t¹o t-¬ng øng cña líp c¬ së, sau ®ã ®Õn hµm t¹o cña líp dÉn xuÊt. Do ®ã, th«ng th-êng, trong hµm t¹o cña líp dÉn xuÊt ph¶i cã hµm t¹o cña líp c¬ së. Có ph¸p khai b¸o hµm t¹o nh- sau: ([]): ([]) { …// Khëi t¹o c¸c thuéc tÝnh míi bæ sung cña líp dÉn xuÊt }; V× tªn hµm t¹o lµ trïng víi tªn líp, nªn cã thÓ viÕt l¹i thµnh: ([]): Trang - 95 -
  9. LËp tr×nh h-íng ®èi t-îng ([]) { …// Khëi t¹o c¸c thuéc tÝnh míi bæ sung cña líp dÉn xuÊt }; VÝ dô 3.4: Bus():Car() { …// Khëi t¹o c¸c thuéc tÝnh míi bæ sung cña líp Bus } lµ mét ®Þnh nghÜa hµm t¹o cña líp Bus thõa kÕ tõ líp Car. §Þnh nghÜa nµy ®-îc thùc hiÖn trong ph¹m vi khai b¸o líp Bus. §©y lµ mét hµm t¹o kh«ng tham sè, nã gäi tíi hµm t¹o kh«ng tham sè cña líp Car. L-u ý: NÕu ®Þnh nghÜa hµm t¹o bªn ngoµi ph¹m vi líp th× ph¶i thªm tªn líp dÉn xuÊt vµ to¸n tö ph¹m vi “ ::” tr-íc tªn hµm t¹o. Gi÷a tªn hµm t¹o cña líp dÉn xuÊt vµ hµm t¹o cña líp c¬ së, chØ cã mét dÊu hai chÊm “ :” , nÕu lµ hai dÊu “ ::” th× trë thµnh to¸n tö ph¹m vi líp. NÕu kh«ng chØ râ hµm t¹o cña líp c¬ së sau dÊu hai chÊm “ :” ch-¬ng tr×nh sÏ tù ®éng gäi hµm t¹o ngÇm ®Þnh hoÆc hµm t¹o kh«ng cã tham sè cña líp c¬ së nÕu hµm ®ã ®-îc ®Þnh nghÜa t-êng minh trong líp c¬ së. VÝ dô, ®Þnh nghÜa hµm t¹o: Bus():Car() { …// Khëi t¹o c¸c thuéc tÝnh míi bæ sung cña líp Bus }; Cã thÓ thay b»ng: Bus() { //Gäi hµm t¹o kh«ng tham sè cña líp Car …// Khëi t¹o c¸c thuéc tÝnh míi bæ sung cña líp Bus }; VÝ dô sau ®Þnh nghÜa líp Car cã 3 thuéc tÝnh víi hai hµm t¹o, sau ®ã ®Þnh nghÜa líp Bus cã thªm thuéc tÝnh label lµ sè hiÖu cña tuyÕn xe buýt. Líp Bus sÏ ®-îc cµi ®Æt hai hµm t¹o t-êng minh, gäi ®Õn hai hµm t¹o t-¬ng øng cña líp Car. Trang - 96 -
  10. LËp tr×nh h-íng ®èi t-îng VÝ dô 3.5: #include /* §Þnh nghÜa líp Car */ class Car { int speed; // Tèc ®é char mark[20]; // Nh·n hiÖu float price; // Gi¸ xe public: Car(); // Hµm t¹o kh«ng tham sè Car(int, char[], float); // Hµm t¹o cã tham sè }; Car::Car() // Hµm t¹o kh«ng tham sè { speed = 0; strcpy(mark, “ ” ); price = 0; } // Hµm t¹o cã tham sè Car::Car(int speedIn, char markIn[], float priceIn) { speed = speedIn; strcpy(mark, markIn); price = priceIn; } /* §Þnh nghÜa líp Bus thõa kÕ tõ líp Car */ class Bus: public Car { int label; // Sè hiÖu tuyÕn xe public: Bus(); // Hµm t¹o kh«ng tham sè Bus(int, char[], float, int); // Hµm t¹o cã tham sè }; Trang - 97 -
  11. LËp tr×nh h-íng ®èi t-îng Bus::Bus():Car() // Hµm t¹o kh«ng tham sè { label = 0; } // Hµm t¹o cã tham sè Bus::Bus(int sIn, char mIn[], float pIn, int lIn):Car(sIn, mIn, pIn) { label = lIn; } Trong hµm t¹o cña líp Bus, muèn khëi t¹o c¸c thuéc tÝnh cña líp Car, ta ph¶i khëi t¹o gi¸n tiÕp th«ng qua hµm t¹o cña líp Car mµ kh«ng thÓ g¸n gi¸ trÞ trùc tiÕp cho c¸c thuéc tÝnh speed, mark vµ price. LÝ do lµ c¸c thuéc tÝnh nµy cã tÝnh chÊt private, nªn líp dÉn xuÊt kh«ng thÓ truy nhËp trùc tiÕp ®Õn chóng. 3.2.2. Hµm huû cña líp dÉn xuÊt Khi mét ®èi t-îng cña líp dÉn xuÊt bÞ gi¶i phãng khái bé nhí, thø tù gäi c¸c hµm hñy ng-îc víi thø tù gäi hµm t¹o: gäi hµm hñy cña líp dÉn xuÊt tr-íc khi gäi hµm hñy cña líp c¬ së. V× mçi líp chØ cã nhiÒu nhÊt lµ mét hµm hñy, nªn ta kh«ng cÇn ph¶i chØ ra hµm hñy nµo cña líp c¬ së sÏ ®-îc gäi sau khi hñy bá ®èi t-îng cña líp dÉn xuÊt. Do vËy, hµm hñy trong líp dÉn xuÊt ®-îc khai b¸o vµ ®Þnh nghÜa hoµn toµn gièng víi c¸c líp th«ng th-êng: ::~([]) { …// gi¶i phãng phÇn bé nhí cÊp ph¸t cho c¸c thuéc tÝnh bæ sung } L-u ý: Hµm hñy cña líp dÉn xuÊt chØ gi¶i phãng phÇn bé nhí ®-îc cÊp ph¸t ®éng cho c¸c thuéc tÝnh míi bæ sung trong líp dÉn xuÊt (nÕu cã), mµ kh«ng ®-îc gi¶i phãng bé nhí ®-îc cÊp cho c¸c thuéc tÝnh trong líp c¬ së (phÇn nµy lµ do hµm hñy cña líp c¬ së ®¶m nhiÖm). Kh«ng ph¶i gäi t-êng minh hµm hñy cña líp c¬ së trong hµm hñy cña líp dÉn xuÊt. Ngay c¶ khi líp dÉn xuÊt kh«ng ®Þnh nghÜa t-êng minh hµm hñy (do kh«ng cÇn thiÕt) mµ líp c¬ së l¹i cã ®Þnh nghÜa t-êng minh. Ch-¬ng tr×nh vÉn gäi hµm Trang - 98 -
  12. LËp tr×nh h-íng ®èi t-îng hñy ngÇm ®Þnh cña líp dÉn xuÊt, sau ®ã vÉn gäi hµm hñy t-êng minh cña líp c¬ së. VÝ dô sau cµi ®Æt líp Bus thõa kÕ tõ líp Car: líp Car cã mét thuéc tÝnh cã d¹ng con trá nªn cÇn gi¶i phãng b»ng hµm hñy t-êng minh. Líp Bus cã thªm mét thuéc tÝnh cã d¹ng con trá lµ danh s¸ch c¸c ®-êng phè mµ xe buýt ®i qua (m¶ng ®éng c¸c chuçi kÝ tù *char[]) nªn còng cÇn gi¶i phãng b»ng hµm hñy t-êng minh. VÝ dô 3.6: #include /* §Þnh nghÜa líp Car */ class Car { char *mark; // Nh·n hiÖu xe public: ~Car(); // Hñy bá t-êng minh }; Car::~Car(){ // Hñy bá t-êng minh delete [] mark; } /* §Þnh nghÜa líp Bus thõa kÕ tõ líp Car */ class Bus: public Car { char *voyage[]; // Hµnh tr×nh tuyÕn xe public: ~Bus(); // Hñy bá t-êng minh }; Bus::~Bus(){ // Hñy bá t-êng minh delete [] voyage; } Trong hµm hñy cña líp Bus, ta chØ ®-îc gi¶i phãng vïng nhí ®-îc cÊp ph¸t cho thuéc tÝnh voyage (hµnh tr×nh cña xe buýt), lµ thuéc tÝnh ®-îc bæ sung thªm cña líp Bus mµ kh«ng ®-îc gi¶i phãng vïng nhí cÊp ph¸t cho thuéc tÝnh mark Trang - 99 -
  13. LËp tr×nh h-íng ®èi t-îng (nh·n hiÖu xe), viÖc nµy lµ thuéc tr¸ch nhiÖm cña hµm hñy cña líp Car v× thuéc tÝnh mark ®-îc khai b¸o trong líp Car. 3.3. Ph¹m vi truy xuÊt ®Õn c¸c thµnh phÇn cña líp c¬ së Ta xÐt ph¹m vi truy xuÊt theo hai lo¹i:  Ph¹m vi truy xuÊt tõ c¸c hµm b¹n, líp b¹n cña líp dÉn xuÊt  Ph¹m vi truy xuÊt tõ c¸c ®èi t-îng cã kiÓu líp dÉn xuÊt Truy xuÊt tõ c¸c hµm b¹n vµ líp b¹n cña líp dÉn xuÊt Víi dÉn xuÊt private, hµm b¹n cã thÓ truy xuÊt ®-îc c¸c thµnh phÇn protected vµ public cña líp c¬ së v× chóng trë thµnh c¸c thµnh phÇn private cña líp dÉn xuÊt, cã thÓ truy xuÊt ®-îc tõ hµm b¹n. Víi dÉn xuÊt protected, hµm b¹n còng cã thÓ truy xuÊt ®-îc c¸c thµnh phÇn protected vµ public cña líp c¬ së v× chóng trë thµnh c¸c thµnh phÇn protected cña líp dÉn xuÊt, cã thÓ truy xuÊt ®-îc tõ hµm b¹n. Víi dÉn xuÊt public, hµm b¹n còng cã thÓ truy xuÊt ®-îc c¸c thµnh phÇn protected vµ public cña líp c¬ së v× chóng trë thµnh c¸c thµnh phÇn protected vµ public cña líp dÉn xuÊt, cã thÓ truy xuÊt ®-îc tõ hµm b¹n. §èi víi c¶ ba lo¹i dÉn xuÊt, hµm b¹n ®Òu kh«ng truy xuÊt ®-îc c¸c thµnh phÇn private cña líp c¬ së, v× c¸c thµnh phÇn nµy còng kh«ng truy xuÊt ®-îc tõ líp dÉn xuÊt. Truy xuÊt tõ c¸c ®èi t-îng t¹o bëi líp dÉn xuÊt Víi dÉn xuÊt private, ®èi t-îng cña líp dÉn xuÊt kh«ng truy xuÊt ®-îc bÊt cø thµnh phÇn nµo cña líp c¬ së v× chóng trë thµnh c¸c thµnh phÇn private cña líp dÉn xuÊt, kh«ng truy nhËp ®-îc tõ bªn ngoµi. Víi dÉn xuÊt protected, ®èi t-îng cña líp dÉn xuÊt kh«ng truy xuÊt ®-îc bÊt cø thµnh phÇn nµo cña líp c¬ së v× chóng trë thµnh c¸c thµnh phÇn protected cña líp dÉn xuÊt, kh«ng truy xuÊt ®-îc tõ bªn ngoµi. Víi dÉn xuÊt public, ®èi t-îng cña líp dÉn xuÊt cã thÓ truy xuÊt ®-îc c¸c thµnh phÇn public cña líp c¬ së v× chóng trë thµnh c¸c thµnh phÇn public cña líp dÉn xuÊt, cã thÓ truy nhËp ®-îc tõ bªn ngoµi. ViÖc gäi ®Õn c¸c thµnh phÇn cña líp c¬ së còng t-¬ng tù nh- gäi c¸c thµnh phÇn líp th«ng th-êng: §èi víi biÕn ®èi t-îng th«ng th-êng: Trang - 100 -
  14. LËp tr×nh h-íng ®èi t-îng .([C¸c tham sè]); §èi víi con trá ®èi t-îng: ->([C¸c tham sè]); L-u ý: C¸ch gäi hµm thµnh phÇn nµy ®-îc ¸p dông khi trong líp dÉn xuÊt, ta kh«ng ®Þnh nghÜa l¹i c¸c hµm thµnh phÇn cña líp c¬ së. VÝ dô sau minh häa viÖc sö dông c¸c thµnh phÇn líp c¬ së tõ ®èi t-îng líp dÉn xuÊt: lípBus thõa kÕ tõ líp Car. Líp Bus cã ®Þnh nghÜa bæ sung mét sè ph-¬ng thøc vµ thuéc tÝnh míi. Khi ®ã, ®èi t-îng cña líp Bus cã thÓ gäi c¸c hµm public cña líp Bus còng nh- cña líp Car. VÝ dô 3.7: #include #include #include /* §Þnh nghÜa líp Car */ class Car { private: int speed; // Tèc ®é char mark[20]; // Nh·n hiÖu float price; // Gi¸ xe public: void setSpeed(int); // G¸n tèc ®é cho xe int getSpeed(); // §äc tèc ®é xe void setMark(char); // G¸n nh·n cho xe char[] getMark(); // §äc nh·n xe void setPrice(float); // G¸n gi¸ cho xe float getPrice(); // §äc gi¸ xe // Khëi t¹o th«ng tin vÒ xe Car(int speedIn=0, char markIn[]=” ” , float priceIn=0); void show(); // Giíi thiÖu xe }; /* Khai b¸o ph-¬ng thøc bªn ngoµi líp */ Trang - 101 -
  15. LËp tr×nh h-íng ®èi t-îng Car::Car(int speedIn, char markIn[], float priceIn) { speed = speedIn; strcpy(mark, markIn); price = priceIn; } void Car::setSpeed(int speedIn) // G¸n tèc ®é cho xe { speed = speedIn; } int Car::getSpeed() // §äc tèc ®é xe { return speed; } void Car::setMark(char markIn) // G¸n nh·n cho xe { strcpy(mark, markIn); } char[] Car::getMark()// §äc nh·n xe { return mark; } void Car::setPrice(float priceIn) // G¸n gi¸ cho xe { price = priceIn; } float Car::getPrice()// §äc gi¸ xe { return price; } void Car::show() // Ph-¬ng thøc giíi thiÖu xe { cout
  16. LËp tr×nh h-íng ®èi t-îng
  17. LËp tr×nh h-íng ®èi t-îng cout > speedIn; cout > markIn; cout > priceIn; cout > labelIn; myBus.setSpeed(speedIn); // Ph-¬ng thøc cña líp Car myBus.setMark(markIn); // Ph-¬ng thøc cña líp Car myBus.setPrice(priceIn); // Ph-¬ng thøc cña líp Car myBus.setLabel(labelIn); // Ph-¬ng thøc cña líp Bus myBus.show(); // Ph-¬ng thøc cña líp Car return; } Trong ch-¬ng tr×nh trªn, ®èi t-îng myBus cã kiÓu líp Bus, lµ líp dÉn xuÊt cña líp c¬ së Car, cã thÓ sö dông c¸c ph-¬ng thøc cña líp Car vµ líp Bus mét c¸ch b×nh ®¼ng. Khi ®ã, lÖnh myBus.show() sÏ gäi ®Õn ph-¬ng thøc show() cña líp Car. 3.4. Thõa kÕ nhiÒu møc vµ sù trïng tªn 3.4.1. S¬ ®å x©y dùng c¸c líp dÉn xuÊt theo nhiÒu møc Mét líp sau khi khai b¸o cã thÓ dïng lµm líp c¬ së cho c¸c líp dÉn xuÊt, ®Õn l-ît m×nh c¸c líp dÉn xuÊt l¹i cã thÓ lµ líp c¬ së cho c¸c líp dÉn xuÊt kh¸c. Sù tiÕp tôc theo c¸ch trªn lµ kh«ng h¹n chÕ. HiÖn t-îng nµy ®-îc gäi lµ sù thõa kÕ nhiÒu møc. Mét líp cã thÓ ®-îc dÉn xuÊt tõ nhiÒu líp c¬ së. §Ó dÔ h×nh dung ta cã thÓ ®-a ra s¬ ®å minh ho¹ viÖc x©y dùng c¸c líp dÉn xuÊt theo nhiÒu møc nh- sau: Trang - 104 -
  18. LËp tr×nh h-íng ®èi t-îng A B C D E F G H S¬ ®å 3.1 Trong s¬ ®å 3.1: Líp A, líp B lµ líp c¬ së cña líp D Líp A, líp B, líp D lµ líp c¬ së cña líp F, líp G Líp B, líp C lµ líp c¬ së cña líp E Líp B, líp C, líp E lµ líp c¬ së cña líp G, líp H 3.4.2. Sù thõa kÕ nhiÒu møc Theo tÝnh thõa kÕ: líp dÉn xuÊt ®-îc thõa kÕ tÊt c¶ c¸c thµnh phÇn (thuéc tÝnh vµ ph-¬ng thøc) cña líp c¬ së, kÓ c¶ c¸c thµnh phÇn mµ líp c¬ së ®-îc thõa kÕ. Hay cã thÓ nãi líp dÉn xuÊt ®-î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 (c¸c líp tiÒn bèi). Trong s¬ ®å dÉn xuÊt 3.1: Líp D ®-îc thõa kÕ tÊt c¶ c¸c thµnh phÇn cña líp A, B Líp F, G ®-îc thõa kÕ tÊt c¶ c¸c thµnh phÇn cña líp D, A, B Líp E ®-îc thõa kÕ tÊt c¶ c¸c thµnh phÇn cña líp B, líp C Líp H, líp G ®-îc thõa kÕ tÊt c¶ c¸c thµnh phÇn cña líp B, líp C, líp E 3.4.3. Sù trïng tªn Nguyªn t¾c ®Æt tªn khi x©y dùng c¸c líp ®èi t-îng nh- sau:  Tªn c¸c líp kh«ng ®-îc trïng nhau  Tªn c¸c thuéc tÝnh ®-îc khai b¸o trong cïng mét líp kh«ng ®-îc trïng nhau  Tªn c¸c thuéc tÝnh, ph-¬ng thøc cña c¸c líp kh¸c nhau cã thÓ ®Æt trïng nhau Nguyªn t¾c thø ba, vµ sù dÉn xuÊt nhiÒu møc sÏ dÉn ®Õn hiÖn t-îng trong mét líp sÏ cã nhiÒu thµnh phÇn trïng tªn nhau (do mét sè thµnh phÇn ®-îc thõa kÕ). VÝ dô 3.8 : Trang - 105 -
  19. LËp tr×nh h-íng ®èi t-îng class A { protected : int x, y ; }; class B { public : int x, z ; }; class C : public A, public B { private : int y, z, t ; }; Trong vÝ dô nµy líp C sÏ cã c¸c thuéc tÝnh cã tªn lµ: y, z, t, x. Trong ®ã, hai thuéc tÝnh cã tªn x, mét ®-îc thõa kÕ tõ A, mét ®-îc thõa kÕ tõ B; hai thuéc tÝnh cã tªn lµ y, mét lµ thuéc riªng cña C, mét ®-îc thõa kÕ tõ A; hai thuéc tÝnh cã tªn lµ z. 3.4.4. Sö dông c¸c thµnh phÇn trong líp dÉn xuÊt Trong s¬ dÉn xuÊt nhiÒu møc cã thÓ xuÊt hiÖn hiÖn t-îng trïng tªn. §Ó ph©n biÖt c¸c thµnh phÇn trïng tªn nµy, ta cÇn sö dông tªn_líp vµ to¸n tö ph¹m vi ( :: ) tr-íc tªn thµnh phÇn. Trong vÝ dô 3.8, trong ph-¬ng thøc cña líp C ®Ó truy nhËp vµo thuéc tÝnh x ta cÇn viÕt: A::x ®Ó truy nhËp vµo thuéc tÝnh x ®-îc thõa kÕ tõ A hoÆc B::x ®Ó truy nhËp vµo thuéc tÝnh x ®-îc thõa kÕ tõ B. Trong tr-êng hîp ta kh«ng sö dông tªn líp vµ to¸n tö ph¹m tr-íc tªn thµnh phÇn, ch-¬ng tr×nh dÞch sÏ ph¶i tù x¸c ®Þnh ®Ó biÕt thµnh phÇn ®ã thuéc líp nµo theo quy t¾c: Tr-íc tiªn nã xem thµnh phÇn ®ang xÐt cã trïng tªn víi thµnh phÇn nµo cña líp dÉn xuÊt hay kh«ng. NÕu kh«ng trïng th× tiÕp tôc xÐt ®Õn c¸c líp c¬ së cã quan hÖ gÇn nhÊt víi líp dÉn xuÊt trong s¬ ®å thõa kÕ (líp “ cha” -> líp “ «ng” ->...). NÕu thµnh phÇn ®ang xÐt xuÊt hiÖn trong hai líp c¬ së ®ång cÊp th× Trang - 106 -
  20. LËp tr×nh h-íng ®èi t-îng ch-¬ng tr×nh dÞch kh«ng thÓ x¸c ®Þnh ®-îc thµnh phÇn nµy thuéc líp nµo vµ ph¶i ®-a ra th«ng b¸o lçi. VÝ dô thuéc tÝnh x trong vÝ dô 3.8. 3.5. Líp c¬ së ¶o 3.5.1. Mét sè líp c¬ së xuÊt hiÖn nhiÒu lÇn trong líp dÉn xuÊt A B C D E F G H S¬ ®å 3.2 Trong s¬ ®å dÉn xuÊt trªn ta thÊy líp c¬ së B ®-îc ®Ò cËp hai lÇn trong líp dÉn xuÊt G th«ng qua hai líp c¬ së trung gian D vµ E. Khi ®ã, trong líp G nÕu ta truy nhËp vµo mét thµnh phÇn cña líp B th× ch-¬ng tr×nh dÞch sÏ kh«ng thÓ ph©n biÖt ®-îc thµnh phÇn ®ã ®-îc thõa kÕ th«ng qua líp D hay líp E vµ ®-a ra th«ng b¸o Member is ambigous 3.5.2. C¸c líp c¬ së ¶o Gi¶i ph¸p cho vÊn ®Ò mét líp c¬ së xuÊt hiÖn nhiÒu lÇn trong líp dÉn xuÊt ta sö dông líp c¬ së ¶o. C¸c líp c¬ së ¶o sÏ ®-îc kÕt hîp ®Ó t¹o mét líp c¬ së duy nhÊt cho bÊt kú líp nµo dÉn xuÊt tõ chóng. Trong s¬ ®å dÉn xuÊt 3.2 ta cÇn khai b¸o líp B lµ líp c¬ së ¶o. §Ó mét líp trë thµnh líp c¬ së ¶o, ta chØ cÇn thªm tõ kho¸ virtual tr-íc tªn líp c¬ së khi x©y dùng líp dÉn xuÊt. VÝ dô 3.9: class B { //Khai b¸o c¸c thµnh phÇn cña líp B; }; class D : virtual public B { //Khai b¸o c¸c thµnh phÇn cña líp D Trang - 107 -
nguon tai.lieu . vn