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
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
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 đủ
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:
bai_giang_lap_trinh_huong_doi_tuong_phan_2.pdf

