Xem mẫu
- 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 -
- 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 -
- 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 -
- 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 -
- 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
- 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 -
- 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 -
- 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 -
- 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 -
- 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 -
- 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 -
- 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 -
- 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 -
- 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 -
- 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
- LËp tr×nh h-íng ®èi t-îng
- 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 -
- 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 -
- 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 -
- 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