Xem mẫu
- 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
- 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
- {
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ë.
- 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:
- 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
- // 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
- 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
- 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
- {
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
- h.in();
cout
- 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
- 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()
- {
if (monhoc!=NULL)
{
delete monhoc;
st=0;
}
}
void in()
{
cout
- strcpy(ht,ht1);
ns=ns1;
}
~NGUOI()
{
if (ht!=NULL)
{
delete ht;
ns=0;
}
}
void in()
{
cout
- 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
- 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ë, nhng 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, nhng
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:
- + 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Õ nhng 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;
- }
A(int t1, int t2)
{
a1=t1; a2= t2;
}
void in()
{
cout
- {
cout
- 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