Bài giảng Lập trình hướng đối tượng (Phần 2)

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 <Tªn líp dÉn xuÊt>: <Tõ khãa dÉn xuÊt> <Tªn líp c¬ së>  
{
…// 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<iostream.h>  
#include<string.h>  
#include<conio.h>  
#include<iomanip.h>  
#include<ctype.h>  
#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<<"Ma so:"<<MaSo<<",Ho va ten:"<<HoTen;  
cout <<",Luong:"<<setiosflags(ios::fixed);  
cout<<setprecision(0)<<Luong<<endl;  
}
void Nguoi::Nhap()  
{
cout<<"Ma so:";  
cin>>MaSo;  
cin.ignore();  
cout<<"Ho va ten:";  
cin.getline(HoTen,MAX_TEN);  
}
class BienChe: public Nguoi  
Trang - 92 -  
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();  
cout<<"He so luong:";  
cin>>HeSoLuong;  
cout<<"He so phu cap chu vu:";  
cin>>HeSoPhuCap;  
}
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();  
cout<<"Tien cong:";  
cin>>TienCong;  
cout<<"Ngay cong:";  
cin>>NgayCong;  
cout<<"He so vuot gio:";  
cin>>HeSoVuotGio;  
}
void HopDong::TinhLuong()  
{
Luong=TienCong*NgayCong*(1+HeSoVuotGio);  
}
int main()  
{
Nguoi *Ng[100];  
int N=0;  
char Chon,Loai;  
clrscr();  
do  
{
cout<<"Bien che hay Hop dong (B/H)? ";  
cin>>Loai;  
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();  
cout<<"Tiep tuc (C/K)? ";  
cin>>Chon;  
Chon=toupper(Chon);  
if ((N==100)||(Chon=='K'))  
break;  
}while (1);  
for(int I=0;I<N;++I)  
{
Ng[I]->TinhLuong();  
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:  
<Tªn hµm t¹o cña líp dÉn xuÊt>([<C¸c tham sè>]):  
<Tªn hµm t¹o cña líp c¬ së>([<C¸c tham sè>])  
{
…// 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:  
<Tªn líp dÉn xuÊt>([<C¸c tham sè>]):  
Trang - 95 -  
LËp tr×nh h íng ®èi t îng  
<Tªn líp c¬ së>([<C¸c tham sè sè>])  
{
…// 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<string.h>  
/* §Þ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:  
<Tªn líp>::~<Tªn líp>([<C¸c tham sè>])  
{
…// 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<string.h>  
/* §Þ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  
<Tªn ®èi t îng>.<Tªn thµnh phÇn>([C¸c tham sè]);  
§èi víi con trá ®èi t îng:  
<Tªn ®èi t îng>-><Tªn thµnh phÇn>([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<stdio.h>  
#include<conio.h>  
#include<string.h>  
/* §Þ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 << “This is a ” << mark << “ having a speed of ”  
Trang - 102 -  
LËp tr×nh h íng ®èi t îng  
<< speed << “km/h and its price is $” << price << endl;  
return;  
}
/* §Þ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(int sIn=0, char mIn[]=””, float pIn=0, int lIn=0);  
void setLabel(int); // G¸n sè hiÖu tuyÕn xe  
int getLabel(); // §äc sè hiÖu tuyÕn xe  
};  
Bus::Bus(int sIn, char mIn[], float pIn, int lIn):Car(sIn, mIn, pIn)  
{
label = lIn;  
}
void Bus::setLabel(int labelIn) // G¸n sè hiÖu tuyÕn xe  
{
label = labelIn;  
}
int Bus::getLabel() // §äc sè hiÖu tuyÕn xe  
{
return label;  
}
// Ch ¬ng tr×nh chÝnh  
void main()  
{
clrscr();  
Bus myBus; // BiÕn ®èi t îng cña líp Bus  
int speedIn, labelIn;  
float priceIn;  
char markIn[20];  
// NhËp gi¸ trÞ cho c¸c thuéc tÝnh  
Trang - 103 -  
LËp tr×nh h íng ®èi t îng  
cout << “Toc do xe bus:”;  
cin >> speedIn;  
cout << “Nhan hieu xe bus:”;  
cin >> markIn;  
cout << “Gia xe bus:”;  
cin >> priceIn;  
cout << “So hieu tuyen xe bus:”;  
cin >> 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
E
D
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
D
B
C
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 -  
Tải về để xem bản đầy đủ
pdf 166 trang yennguyen 20940 Free
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình hướng đối tượng (Phần 2)", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_lap_trinh_huong_doi_tuong_phan_2.pdf