Giáo trình Lập trình hướng đối tượng với C++ - Chương 5: Kỹ thuật thừa kế
Ch-¬ng 5
Kü thuËt thõa kÕ
(Inheritance)
Môc ®Ých ch-¬ng nµy:
Cµi ®Æt sù thõa kÕ.
1.
2.
3.
4.
Sö dông c¸c thµnh phÇn cña líp c¬ së.
§Þnh nghÜa l¹i c¸c hµm thµnh phÇn.
TruyÒn th«ng tin gi÷a c¸c hµm thiÕt lËp cña líp dÉn xuÊt vµ líp c¬ së.
5. C¸c lo¹i dÉn xuÊt kh¸c nhau vµ sù thay ®æi tr¹ng th¸i cña c¸c thµnh phÇn líp c¬
së.
Sù t-¬ng thÝch gi÷a c¸c ®èi t-îng cña líp dÉn xuÊt vµ líp c¬ së.
6.
7.
To¸n tö g¸n vµ thõa kÕ.
8. Hµm ¶o vµ tÝnh ®a h×nh
Hµm ¶o thuÇn tuý vµ líp c¬ së trõu t-îng
9.
10. §a thõa kÕ vµ c¸c vÊn ®Ò liªn quan.
Giíi thiÖu chung
Thõa kÕ lµ mét trong bèn nguyªn t¾c c¬ së cña ph-¬ng ph¸p lËp tr×nh h-íng
®èi t-îng. §Æc biÖt ®©y lµ c¬ së cho viÖc n©ng cao kh¶ n¨ng sö dông l¹i c¸c bé
phËn cña ch-¬ng tr×nh. Thõa kÕ cho phÐp ta ®Þnh nghÜa mét líp míi, gäi lµ líp dÉn
xuÊt, tõ mét líp ®· cã, gäi lµ líp c¬ së. Líp dÉn xuÊt sÏ thõa kÕ c¸c thµnh phÇn (d÷
liÖu, hµm) cña líp c¬ së, ®ång thêi thªm vµo c¸c thµnh phÇn míi, bao hµm c¶ viÖc
lµm “tèt h¬n” hoÆc lµm l¹i nh÷ng c«ng viÖc mµ trong líp c¬ së ch-a lµm tèt hoÆc
kh«ng cßn phï hîp víi líp dÉn xuÊt. Ch¼ng h¹n cã thÓ ®Þnh nghÜa líp “mÆt hµng
nhËp khÈu” dùa trªn líp “mÆt hµng”, b»ng c¸ch bæ sung thªm thuéc tÝnh “thuÕ”.
Khi ®ã c¸ch tÝnh chªnh lÖch gi¸ b¸n, mua cò trong líp “mÆt hµng” sÏ kh«ng phï
hîp n÷a nªn cÇn ph¶i söa l¹i cho phï hîp. Líp ®iÓm cã mµu ®-îc ®Þnh nghÜa dùa
trªn líp ®iÓm kh«ng mµu b»ng c¸ch bæ sung thªm thuéc tÝnh mµu, hµm display()
lóc nµy ngoµi viÖc hiÓn thÞ hai thµnh phÇn to¹ ®é cßn ph¶i cho biÕt mµu cña ®èi
t-îng ®iÓm. Trong c¶ hai vÝ dô ®-a ra, trong líp dÉn xuÊt ®Òu cã sù bæ sung vµ thay
®æi thÝch hîp víi t×nh h×nh míi.
Thõa kÕ cho phÐp kh«ng cÇn ph¶i biªn dÞch l¹i c¸c thµnh phÇn ch-¬ng tr×nh
vèn ®· cã trong c¸c líp c¬ së vµ h¬n thÕ n÷a kh«ng cÇn ph¶i cã ch-¬ng tr×nh nguån
t-¬ng øng. Kü thuËt nµy cho phÐp chóng ta ph¸t triÓn c¸c c«ng cô míi dùa trªn
-161-
Kü thuËt thõa kÕ
nh÷ng g× ®· cã ®-îc. Ng-êi sö dông Borland C hay Turbo Pascal 6.0/7.0 rÊt thÝch
sö dông Turbo Vision - mét th- viÖn cung cÊp c¸c líp, ®èi t-îng lµ c¬ së ®Ó x©y
dùng c¸c giao diÖn øng dông hÕt søc th©n thiÖn ®èi víi ng-êi sö dông. TÊt c¶ c¸c
líp nµy ®Òu ®-îc cung cÊp d-íi d¹ng c¸c tËp tin *.obj, *.lib nghÜa lµ ng-êi sö dông
hoµn toµn kh«ng thÓ vµ kh«ng cÇn ph¶i biÕt râ phÇn ch-¬ng tr×nh nguån t-¬ng øng.
Tuy nhiªn ®iÒu ®ã kh«ng quan träng khi ng-êi lËp tr×nh ®-îc phÐp thõa kÕ c¸c líp
®Þnh nghÜa tr-íc ®ã.
Thõa kÕ còng cho phÐp nhiÒu líp cã thÓ dÉn xuÊt tõ cïng mét líp c¬ së, nh-ng
kh«ng chØ giíi h¹n ë mét møc: mét líp dÉn xuÊt cã thÓ lµ líp c¬ së cho c¸c líp dÉn
xuÊt kh¸c. ë ®©y ta thÊy r»ng kh¸i niÖm thõa kÕ gièng nh- c«ng cô cho phÐp m« t¶
cô thÓ ho¸ c¸c kh¸i niÖm theo nghÜa: líp dÉn xuÊt lµ mét cô thÓ ho¸ h¬n n÷a cña
líp c¬ së vµ nÕu bá ®i c¸c dÞ biÖt trong c¸c líp dÉn xuÊt sÏ chØ cßn c¸c ®Æc ®iÓm
chung n»m trong líp c¬ së.
H×nh 5.1 m« t¶ mét s¬ ®å thõa kÕ cña c¸c líp, cã cung ®i tõ líp nµy sang líp
kia nÕu chóng cã quan hÖ thõa kÕ. Ta gäi ®ã lµ ®å thÞ thõa kÕ. Sau ®©y lµ mét sè m«
t¶ cho c¸c líp xuÊt hiÖn trong ®å thÞ thõa kÕ ë trªn.
1. Líp mÆt hµng
c¸c thuéc tÝnh
tªn
sè l-îng trong kho
gi¸ mua
gi¸ b¸n
c¸c ph-¬ng thøc
hµm chªnh lÖch gi¸ b¸n mua
{gi¸ b¸n - gi¸ mua}
thñ tôc mua(q)
{Thªm vµo trong kho q ®¬n vÞ mÆt hµng}
thñ tôc b¸n(q)
{Bít ®i q ®¬n vÞ mÆt hµng cã trong kho}
2. Líp mÆt hµng nhËp khÈu thõa kÕ tõ mÆt hµng
c¸c thuéc tÝnh
thuÕ nhËp khÈu
c¸c ph-¬ng thøc
hµm chªnh lÖch gi¸ b¸n -mua
-162-
Kü thuËt thõa kÕ
{gi¸ b¸n - gi¸ mua* thuÕ nhËp khÈu}
3. Líp xe g¾n m¸y thõa kÕ tõ mÆt hµng nhËp khÈu
c¸c thuéc tÝnh
dung tÝch xy lanh
c¸c ph-¬ng thøc
4. Líp hµng ®iÖn tö d©n dông thõa kÕ tõ mÆt hµng
c¸c thuéc tÝnh
®iÖn ¸p
thêi h¹n b¶o hµnh
c¸c ph-¬ng thøc
hµm thêi gian b¶o hµnh thùc tÕ
...
TÝnh ®a h×nh còng lµ mét trong c¸c ®iÓm lý thó trong lËp tr×nh h-íng ®èi t-îng,
®-îc thiÕt lËp trªn c¬ së thõa kÕ trong ®ã ®èi t-îng cã thÓ cã biÓu hiÖn kh¸c nhau
tuú thuéc vµo t×nh huèng cô thÓ. TÝnh ®a h×nh Êy cã thÓ x¶y ra ë mét hµnh vi cña
®èi t-îng hay trong toµn bé ®èi t-îng. VÝ dô trùc quan thÓ hiÖn tÝnh ®a h×nh lµ mét
ti vi cã thÓ võa lµ ®èi t-îng cña mÆt hµng võa lµ ®èi t-îng cña líp mÆt hµng ®iÖn tö
d©n dông. C¸c ®èi t-îng h×nh häc nh- h×nh vu«ng, h×nh trßn, h×nh ch÷ nhËt ®Òu cã
cïng c¸ch vÏ nh- nhau: x¸c ®Þnh hai ®iÓm ®Çu vµ cuèi, nèi hai ®iÓm nµy. Do vËy
thuËt to¸n tuy gièng nhau ®èi víi tÊt c¶ c¸c ®èi t-îng h×nh, nh-ng c¸ch vÏ th× phô
thuéc vµo tõng líp ®èi t-îng cô thÓ. Ta nãi ph-¬ng thøc nèi ®iÓm cña c¸c ®èi t-îng
h×nh häc cã tÝnh ®a h×nh. TÝnh ®a h×nh cßn ®-îc thÓ hiÖn trong c¸ch thøc hiÓn thÞ
th«ng tin trong c¸c ®èi t-îng ®iÓm mµu/kh«ng mµu.
C¸c ng«n ng÷ lËp tr×nh h-íng ®èi t-îng ®Òu cho phÐp ®a thõa kÕ, theo ®ã mét
líp cã thÓ lµ dÉn xuÊt cña nhiÒu líp kh¸c. Do vËy dÉn tíi kh¶ n¨ng mét líp c¬ së cã
thÓ ®-îc thõa kÕ nhiÒu lÇn trong mét líp dÉn xuÊt kh¸c, ta gäi ®ã lµ sù xung ®ét
thõa kÕ. §iÒu nµy hoµn toµn kh«ng hay, cÇn ph¶i tr¸nh. Tõng ng«n ng÷ sÏ cã nh÷ng
gi¶i ph¸p cña riªng m×nh, C++ ®-a ra kh¸i niÖm thõa kÕ ¶o.
Trong ch-¬ng nµy ta sÏ ®Ò cËp tíi c¸c kh¶ n¨ng cña C++ ®Ó thÓ hiÖn nguyªn
t¾c thõa kÕ khi viÕt ch-¬ng tr×nh.
-163-
Kü thuËt thõa kÕ
Líp mÆt hµng
c¸c thuéc tÝnh
tªn
sè l-îng trong kho
gi¸ mua
gi¸ b¸n
c¸c ph-¬ng thøc
chªnh lÖch gi¸
b¸n mua
Líp mÆt hµng nhËp khÈu
c¸c thuéc tÝnh
thuÕ nhËp khÈu
c¸c ph-¬ng thøc
Líp §å ®iÖn tö d©n dông
c¸c thuéc tÝnh
®iÖn ¸p
Líp Xe g¾n m¸y
c¸c thuéc tÝnh
dung tÝch xy
thêi h¹n b¶o hµnh
c¸c ph-¬ng thøc
Líp Tivi
Líp ¤t«
c¸c thuéc tÝnh
kÝch th-íc mµn h×nh
c¸c thuéc tÝnh
M¸c
H×nh 5.1 VÝ dô vÒ s¬ ®å thõa kÕ
-164-
Kü thuËt thõa kÕ
§¬n thõa kÕ
1.1 VÝ dô minh ho¹
Ch-¬ng tr×nh inheri1.cpp sau ®©y lµ mét vÝ dô thÓ hiÖn tÝnh thõa kÕ ®¬n cña
líp coloredpoint, m« t¶ c¸c ®iÓm mµu trªn mÆt ph¼ng, tõ líp c¸c ®iÓm kh«ng
mµu nãi chung point. Ch-¬ng tr×nh nµy ®Ò cËp ®Õn kh¸ nhiÒu khÝa c¹nh, liªn quan
®Õn kü thuËt cµi ®Æt tÝnh thõa kÕ trong C++, ®ã lµ:
Truy nhËp c¸c thµnh phÇn líp c¬ së tõ líp dÉn xuÊt,
(i)
§Þnh nghÜa l¹i (®Ì) c¸c thµnh phÇn líp c¬ së trong líp dÉn xuÊt
TruyÒn th«ng tin gi÷a c¸c hµm thiÕt lËp
VÝ dô 5.1
/*inheri1.cpp*/
#include <iostream.h>
#include <conio.h>
class point {
float x,y;
public:
point() {x = 0; y = 0;}
point(float ox, float oy) {x = ox; y = oy; }
point(point &p) {x = p.x; y = p.y;}
void display() {
cout<<"Goi ham point::display() \n";
cout<<"Toa do :"<<x<<" "<<y<<endl;
}
void move(float dx, float dy) {
x += dx;
y += dy;
}
};
/*lop coloredpoint thõa kÕ tõ point*/
class coloredpoint : public point {
unsigned int color;
public:
-165-
Kü thuËt thõa kÕ
coloredpoint():point() {
color =0;
}
coloredpoint(float ox, float oy, unsigned int c):point(ox,oy) {
color = c;
}
coloredpoint(coloredpoint &b):point((point &)b) {
color = b.color;
}
void display() {
cout<<"Ham coloredpoint::display()\n";
point::display();/*gäi tíi hµm cïng tªn trong líp c¬ së*/
cout<<"Mau "<<color<<endl;
}
};
void main() {
clrscr();
coloredpoint m;
cout<<"Diem m \n";
m.display();
cout<<"Chi hien thi toa do cua m\n";
m.point::display();/*gäi ph-¬ng thøc display trong líp point*/
coloredpoint n(2,3,6);
cout<<"Diem n \n";
n.display();
cout<<"Chi hien thi toa do cua n\n";
n.point::display();
coloredpoint p =n;
cout<<"Diem p \n";
p.display();
cout<<"Chi hien thi toa do cua p\n";
p.point::display();
-166-
Kü thuËt thõa kÕ
getch();
}
Diem m
Ham coloredpoint::display()
Goi ham point::display()
Toa do :0 0
Mau 0
Chi hien thi toa do cua m
Goi ham point::display()
Toa do :0 0
Diem n
Ham coloredpoint::display()
Goi ham point::display()
Toa do :2 3
Mau 6
Chi hien thi toa do cua n
Goi ham point::display()
Toa do :2 3
Diem p
Ham coloredpoint::display()
Goi ham point::display()
Toa do :2 3
Mau 6
Chi hien thi toa do cua p
Goi ham point::display()
Toa do :2 3
1.2 Truy nhËp c¸c thµnh phÇn cña líp c¬ së tõ líp dÉn xuÊt
C¸c thµnh phÇn private trong líp c¬ së kh«ng thÓ truy nhËp ®-îc tõ c¸c líp
dÉn xuÊt. Ch¼ng h¹n c¸c thµnh phÇn private x vµ y trong líp c¬ së point kh«ng
®-îc dïng trong ®Þnh nghÜa c¸c hµm thµnh phÇn cña líp dÉn xuÊt
coloredpoint. Tøc lµ “Ph¹m vi líp” chØ më réng cho b¹n bÌ, mµ kh«ng ®-îc
më réng ®Õn c¸c líp con ch¸u.
-167-
Kü thuËt thõa kÕ
Trong khi ®ã, trong ®Þnh nghÜa cña c¸c hµm thµnh phÇn trong líp dÉn xuÊt
®-îc phÐp truy nhËp ®Õn c¸c thµnh phÇn protected vµ public trong líp dÉn xuÊt,
ch¼ng h¹n cã thÓ gäi tíi hµm thµnh phÇn point::dislay() cña líp c¬ së bªn
trong ®Þnh nghÜa hµm thµnh phÇn coloredpoint::display() trong líp dÉn
xuÊt.
1.3 §Þnh nghÜa l¹i c¸c thµnh phÇn cña líp c¬ së trong líp dÉn xuÊt
Ch-¬ng tr×nh inheri1.cpp còng cã mét vÝ dô minh ho¹ cho ®iÒu nµy: hµm
display() tuy ®· cã trong líp point, ®-îc ®Þnh nghÜa l¹i trong líp
coloredpoint.Lóc nµy, thùc tÕ lµ cã hai phiªn b¶n kh¸c nhau cña display()
cïng tån t¹i trong líp coloredpoint, mét ®-îc ®Þnh nghÜa trong líp point,
®-îc x¸c ®Þnh bëi point::display() vµ mét ®-îc ®Þnh nghÜa trong líp
coloredpoint vµ ®-îc x¸c ®Þnh bëi coloredpoint::display(). Trong
ph¹m vi cña líp dÉn xuÊt hµm thø hai “che lÊp” hµm thø nhÊt, nghÜa lµ tªn gäi
display() trong ®Þnh nghÜa cña hµm thµnh phÇn cña líp coloredpoint hoÆc
trong lêi gäi hµm thµnh phÇn display() tõ mét ®èi t-îng líp coloredpoint
ph¶i tham chiÕu ®Õn coloredpoint::display(). NÕu muèn gäi tíi hµm
display() cña líp point ta ph¶i viÕt ®Çy ®ñ tªn cña nã, nghÜa lµ
point::display(). Trong ®Þnh nghÜa hµm coloredpoint::display()
nÕu ta thay thÕ point::display() bëi display() th× sÏ t¹o ra lêi gäi ®Ö
quy v« h¹n lÇn.
CÇn chó ý r»ng viÖc ®Þnh nghÜa l¹i mét hµm thµnh phÇn kh¸c víi ®Þnh nghÜa
chång hµm thµnh phÇn, bëi v× kh¸i niÖm ®Þnh nghÜa l¹i chØ ®-îc xÐt tíi khi ta nãi
®Õn sù thõa kÕ. Hµm ®Þnh nghÜa l¹i vµ hµm bÞ ®Þnh nghÜa l¹i gièng hÖt nhau vÒ tªn,
tham sè vµ gi¸ trÞ tr¶ vÒ, chóng chØ kh¸c nhau ë vÞ trÝ, mét hµm ®Æt trong líp dÉn
xuÊt vµ hµm kia th× cã mÆt trong líp c¬ së. Trong khi ®ã, c¸c hµm chång chØ cã
cïng tªn, th-êng kh¸c nhau vÒ danh s¸ch tham sè vµ tÊt c¶ chóng thuéc vÒ cïng
mét líp. §Þnh nghÜa l¹i hµm thµnh phÇn chÝnh lµ c¬ së cho viÖc cµi ®Æt tÝnh ®a h×nh
cña c¸c ph-¬ng thøc cña ®èi t-îng.
C++ cßn cho phÐp khai b¸o bªn trong líp dÉn xuÊt c¸c thµnh phÇn d÷ liÖu
cïng tªn víi c¸c thµnh phÇn d÷ liÖu ®· cã trong líp c¬ së. Hai thµnh phÇn cïng tªn
nµy cã thÓ cïng kiÓu hay kh¸c kiÓu. Lóc nµy bªn trong mét ®èi t-îng cña líp dÉn
xuÊt cã tíi hai thµnh phÇn kh¸c nhau cã cïng tªn, nh-ng trong ph¹m vi líp dÉn
xuÊt tªn chung ®ã nh»m chØ ®Þnh thµnh phÇn ®-îc khai b¸o l¹i trong líp dÉn xuÊt.
Khi muèn chØ ®Þnh thµnh phÇn cïng tªn trong líp c¬ së, ph¶i sö dông tªn líp c¬ së
vµ to¸n tö ph¹m vi “::” ®Æt tr-íc tªn thµnh phÇn ®ã.
1.4 TÝnh thõa kÕ trong líp dÉn xuÊt
1.4.1 Sù t-¬ng thÝch cña ®èi t-îng thuéc líp dÉn xuÊt víi ®èi t-îng thuéc líp c¬ së
Mét c¸ch tæng qu¸t, trong lËp tr×nh h-íng ®èi t-îng, mét ®èi t-îng cña líp
dÉn xuÊt cã thÓ “thay thÕ” mét ®èi t-îng cña líp c¬ së. NghÜa lµ: tÊt c¶ nh÷ng
thµnh phÇn d÷ liÖu cã trong líp c¬ së ®Òu t×m thÊy trong líp dÉn xuÊt; tÊt c¶ c¸c
-168-
Kü thuËt thõa kÕ
hµnh ®éng thùc hiÖn ®-îc trªn líp c¬ së lu«n lu«n cã thÓ lµm ®-îc trªn c¸c líp dÉn
xuÊt. Trong ch-¬ng tr×nh inheri1.cpp ta thÊy r»ng: ®èi t-îng m cña líp
coloredpoint cã ®ång thêi hai thµnh phÇn to¹ ®é x , y vµ thªm thµnh phÇn d÷
liÖu bæ sung color; ngoµi ra cã thÓ gäi c¸c hµm thµnh phÇn
point::display() vµ point::move(...) th«ng qua ®èi t-îng m.
TÝnh t-¬ng thÝch gi÷a mét ®èi t-îng cña líp dÉn xuÊt vµ ®èi t-îng líp c¬ së
®-îc thÓ hiÖn ë chç cã thÓ chuyÓn kiÓu ngÇm ®Þnh tõ mét ®èi t-îng cña líp dÉn
xuÊt sang mét ®èi t-îng cña líp c¬ së. XÐt c¸c chØ thÞ sau:
point p;
p.display();
coloredpointcol pc(2,3,5);
c©u lÖnh
p=pc;
p.display();
pc.display();
cho kÕt qu¶
Diem p khong mau
Goi ham point::display()
Toa do :0 0
Diem pc co mau
Ham coloredpoint::display()
Goi ham point::display()
Toa do :2 3
Mau 5
p =pc
Goi ham point::display()
Toa do :2 3
Tuy nhiªn nhËn xÐt trªn ®©y kh«ng hoµn toµn ®óng xÐt theo chiÒu ng-îc l¹i.
C©u lÖnh sau ®©y kh«ng ®óng nÕu kh«ng cã ®Þnh nghÜa chång to¸n tö g¸n g÷a hai
®èi t-îng víi c¸c kiÓu d÷ liÖu coloredpoint vµ point.
pc=p;
-169-
Kü thuËt thõa kÕ
Chó ý
Tõ pc chØ cã thÓ gäi ®Õn c¸c thµnh phÇn hµm public trong líp point (xem
thªm phÇn sau ®Ó hiÓu râ h¬n).
1.4.2 T-¬ng thÝch gi÷a con trá líp dÉn xuÊt vµ con trá líp c¬ së
T-¬ng tù nh- vÊn ®Ò tr×nh bµy trong phÇn trªnmét con trá ®èi t-îng líp c¬ së
cã thÓ chØ ®Õn mét ®èi t-îng líp dÉn xuÊt, cßn mét con trá líp dÉn xuÊt kh«ng thÓ
nhËn ®Þa chØ cña ®èi t-îng líp c¬ së, trõ tr-êng hîp Ðp kiÓu. Ta xÐt ch-¬ng tr×nh vÝ
dô sau:
VÝ dô 5.2
/*inheri2.cpp*/
#include <iostream.h>
#include <conio.h>
class point {
float x,y;
public:
point() {x = 0; y = 0;}
point(float ox, float oy) {x = ox; y = oy; }
point(point &p) {x = p.x; y = p.y;}
void display() {
cout<<"Goi ham point::display() \n";
cout<<"Toa do :"<<x<<" "<<y<<endl;
}
void move(float dx, float dy) {
x += dx;
y += dy;
}
};
/*líp coloredpoint thõa kÕ tõ point*/
class coloredpoint : public point {
unsigned int color;
public:
coloredpoint():point() {
-170-
Kü thuËt thõa kÕ
color =0;
}
coloredpoint(float ox, float oy, unsigned int c):point(ox,oy) {
color = c;
}
coloredpoint(coloredpoint &b):point((point &)b) {
color = b.color;
}
void display() {
cout<<"Ham coloredpoint::display()\n";
point::display();/*gäi tíi hµm cïng tªn trong líp c¬ së*/
cout<<"Mau "<<color<<endl;
}
};
void main() {
clrscr();
point *adp;
coloredpoint pc(2,3,5);
pc.display();
cout<<"adp = &pc \n";
adp=&pc;
adp->move(2,3);
cout<<"adp->move(2,3)\n";
pc.display();
adp->display();
getch();
}
Ham coloredpoint::display()
Goi ham point::display()
Toa do :2 3
Mau 5
-171-
Kü thuËt thõa kÕ
adp = &pc
adp->move(2,3)
Ham coloredpoint::display()
Goi ham point::display()
Toa do :4 6
Mau 5
Goi ham point::display()
Toa do :4 6
NhËn xÐt
Chó ý kÕt qu¶ thùc hiÖn chØ thÞ :
adp->display();
Goi ham point::display()
Toa do :4 6
Nh- vËy, mÆc dï adp chøa ®Þa chØ cña ®èi t-îng coloredpoint lµ pc,
nh-ng
apd->display()
vÉn lµ
point::display()
chø kh«ng ph¶i coloredpoint::display().
HiÖn t-îng nµy ®-îc gi¶i thÝch lµ do adp ®-îc khai b¸o lµ con trá kiÓu point
vµ v× c¸c hµm trong point ®Òu ®-îc khai b¸o nh- b×nh th-êng nªn adp chØ cã thÓ
gäi ®-îc c¸c hµm thµnh phÇn cã trong point chø kh«ng phô thuéc vµo ®èi t-îng
mµ adp chøa ®Þa chØ. Muèn cã ®-îc tÝnh ®a h×nh cho display() nghÜa lµ lêi gäi tíi
display() phô thuéc vµo kiÓu ®èi t-îng cã ®Þa chØ chøa trong adp, ta ph¶i khai
b¸o hµm thµnh phÇn display() trong point nh- lµ mét hµm ¶o. PhÇn sau chóng
ta sÏ ®Ò cËp vÊn ®Ò nµy,
1.4.3 T-¬ng thÝch gi÷a tham chiÕu líp dÉn xuÊt vµ tham chiÕu líp c¬ së
VÊn ®Ò ®-îc xÐt trong phÇn 2.4.2 còng hoµn toµn t-¬ng tù ®èi víi tham chiÕu.
Ta xÐt ch-¬ng tr×nh sau:
VÝ dô 5.3
/*inheri3.cpp*/
-172-
Kü thuËt thõa kÕ
#include <iostream.h>
#include <conio.h>
class point {
float x,y;
public:
point() {x = 0; y = 0;}
point(float ox, float oy) {x = ox; y = oy; }
point(point &p) {x = p.x; y = p.y;}
void display() {
cout<<"Goi ham point::display() \n";
cout<<"Toa do :"<<x<<" "<<y<<endl;
}
void move(float dx, float dy) {
x += dx;
y += dy;
}
};
/*líp coloredpoint thõa kÕ tõ point*/
class coloredpoint : public point {
unsigned int color;
public:
coloredpoint():point() {
color =0;
}
coloredpoint(float ox, float oy, unsigned int c):point(ox,oy) {
color = c;
}
coloredpoint(coloredpoint &b):point((point &)b) {
color = b.color;
}
void display() {
cout<<"Ham coloredpoint::display()\n";
-173-
Kü thuËt thõa kÕ
point::display();
cout<<"Mau "<<color<<endl;
}
};
void main() {
clrscr();
coloredpoint pc(2,3,5);
pc.display();
cout<<"point &rp = pc \n";
point &rp=pc;
rp.move(2,3);
cout<<"rp.move(2,3)\n";
pc.display();
rp.display();
getch();
}
Ham coloredpoint::display()
Goi ham point::display()
Toa do :2 3
Mau 5
point &rp = pc
rp.move(2,3)
Ham coloredpoint::display()
Goi ham point::display()
Toa do :4 6
Mau 5
Goi ham point::display()
Toa do :4 6
-174-
Kü thuËt thõa kÕ
1.5 Hµm thiÕt lËp trong líp dÉn xuÊt
Hµm thiÕt lËp trong líp
1.5.1
NÕu líp cã khai b¸o t-êng minh Ýt nhÊt mét hµm thiÕt lËp th× khi t¹o ra mét ®èi
t-îng sÏ cã mét lêi gäi ®Õn mét trong c¸c hµm thiÕt lËp ®-îc ®Þnh nghÜa. ViÖc chän
lùa hµm thiÕt lËp dùa theo c¸c tham sè ®-îc cung cÊp kÌm theo. Tr-êng hîp kh«ng
cã hµm thiÕt lËp nµo phï hîp sÏ sinh ra mét lçi biªn dÞch. Nh- vËy kh«ng thÓ t¹o ra
mét ®èi t-îng nÕu kh«ng dïng ®Õn mét trong c¸c hµm thiÕt lËp ®· ®-îc ®Þnh nghÜa.
Trong tr-êng hîp thËt sù kh«ng cã hµm thiÕt lËp t-êng minh ta kh«ng thÓ m«
t¶ t-êng tËn c¸c d÷ liÖu cña ®èi t-îng liªn quan. XÐt ch-¬ng tr×nh sau:
VÝ dô 5.4
#include <iostream.h>
#include <conio.h>
/*khai b¸o líp point mµ kh«ng cã hµm thiÕt lËp t-êng minh*/
class point {
float x,y;
public:
void display() {
cout<<"Goi ham point::display() \n";
cout<<"Toa do :"<<x<<" "<<y<<endl;
}
void move(float dx, float dy) {
x += dx;
y += dy;
}
};
void main() {
clrscr();
cout<<"Diem p \n";
point p;
p.display();
getch();
}
-175-
Kü thuËt thõa kÕ
Diem p
Goi ham point::display()
Toa do :8.187236e-34 2.637535e-11
1.5.2 Ph©n cÊp lêi gäi
Mét ®èi t-îng líp dÉn xuÊt vÒ thùc chÊt cã thÓ coi lµ mét ®èi t-îng cña líp c¬
së, v× vËy viÖc gäi hµm thiÕt lËp líp dÉn xuÊt ®Ó t¹o ®èi t-îng líp dÉn xuÊt sÏ kÐo
theo viÖc gäi ®Õn mét hµm thiÕt lËp trong líp c¬ së.
VÒ nguyªn t¾c, nh÷ng phÇn cña ®èi t-îng líp dÉn xuÊt thuéc vÒ líp c¬ së sÏ
®-îc t¹o ra tr-íc khi c¸c th«ng tin míi ®-îc x¸c lËp. Nh- vËy, thø tù thùc hiÖn cña
c¸c hµm thiÕt lËp sÏ lµ: hµm thiÕt lËp cho líp c¬ së, råi ®Õn hµm thiÕt lËp cho líp
dÉn xuÊt nh»m bæ sung nh÷ng th«ng tin cßn thiÕu.
C¬ chÕ trªn ®©y ®-îc thùc hiÖn mét c¸ch ngÇm ®Þnh, kh«ng cÇn ph¶i gäi t-êng
minh hµm thiÕt lËp líp c¬ së trong hµm thiÕt lËp líp dÉn xuÊt (thùc tÕ lµ còng
kh«ng thÓ thùc hiÖn ®-îc ®iÒu ®ã v× kh«ng thÓ gäi hµm thiÕt lËp cña bÊt kú líp nµo
mét c¸ch t-êng minh).
Gi¶i ph¸p cña C++ (còng ®-îc nhiÒu ng«n ng÷ lËp tr×nh h-íng ®èi t-îng kh¸c
chÊp nhËn) lµ: trong ®Þnh nghÜa cña hµm thiÕt lËp líp dÉn xuÊt, ta m« t¶ lu«n mét
lêi gäi tíi mét trong c¸c hµm thiÕt lËp líp c¬ së. H·y xem l¹i ®Þnh nghÜa cña c¸c
hµm thiÕt lËp líp coloredpoint trong ch-¬ng tr×nh inheri1.cpp:
Mét sè nhËn xÐt quan träng
NÕu muèn sö dông hµm thiÕt lËp ngÇm ®Þnh cña líp c¬ së th× cã thÓ kh«ng
cÇn m« t¶ cïng víi ®Þnh nghÜa cña hµm thiÕt lËp líp dÉn xuÊt, nghÜa lµ ®Þnh
nghÜa cña hµm coloredpoint::coloredpoint() cã thÓ viÕt l¹i nh- sau:
(ii)
coloredpoint(){/*®Ó t¹o ph¹n ®èi t-îng point sö dông hµm point::point()*/
color =0;
}
C¸c tham sè mµ hµm thiÕt lËp líp dÉn xuÊt truyÒn cho hµm thiÕt lËp líp c¬
së kh«ng nhÊt thiÕt lÊy nguyªn si tõ c¸c tham sè nã nhËn ®-îc mµ cã thÓ ®-îc
chÕ biÕn ®i Ýt nhiÒu. VÝ dô, ta cã thÓ viÕt l¹i ®Þnh nghÜa cho
coloredpoint::coloredpoint(float, float,unsigned) nh- sau:
(iii)
coloredpoint::coloredpoint
(float ox, float oy, unsigned c) : point((ox+oy)/2, (ox-oy)/2)
{
color = c;
}
-176-
Kü thuËt thõa kÕ
1.5.3 Hµm thiÕt lËp sao chÐp
NÕu trong líp dÉn xuÊt kh«ng khai b¸o t-êng minh hµm thiÕt lËp sao chÐp, th×
c«ng viÖc nµy ®-îc ch-¬ng tr×nh biªn dÞch ®¶m nhiÖm nhê ®Þnh nghÜa hµm thiÕt lËp
sao chÐp ngÇm ®Þnh.
VÒ nguyªn t¾c, trong ®Þnh nghÜa cña hµm thiÕt lËp sao chÐp líp dÉn xuÊt ta cã
thÓ m« t¶ bÊt kú hµm thiÕt lËp nµo cã mÆt trong líp c¬ së. Ch-¬ng tr×nh sau minh
ho¹ ®iÒu ®ã:
VÝ dô 5.5
/*inheri4.cpp*/
#include <iostream.h>
#include <conio.h>
class point {
float x,y;
public:
float getx() {return x;}
float gety() {return y;}
point() {x = 0; y = 0;}
point(float ox, float oy) {x = ox; y = oy; }
point(point &p) {x = p.x; y = p.y;}
void display() {
cout<<"Goi ham point::display() \n";
cout<<"Toa do :"<<x<<" "<<y<<endl;
}
void move(float dx, float dy) {
x += dx;
y += dy;
}
};
/*líp coloredpoint thõa kÕ tõ point*/
class coloredpoint : public point {
unsigned int color;
public:
coloredpoint():point() {
-177-
Kü thuËt thõa kÕ
color =0;
}
coloredpoint(float ox, float oy, unsigned int c);
coloredpoint(coloredpoint &b):point(b.getx(),b.gety()) {
cout<<"Goi ham thiet lap sao chep""
<<" coloredpoint::coloredpoint(coloredpoint &) \n";
color = b.color;
}
void display() {
cout<<"Ham coloredpoint::display()\n";
point::display();
cout<<"Mau "<<color<<endl;
}
};
coloredpoint::coloredpoint
(float ox, float oy, unsigned c) : point(ox, oy)
{
color = c;
}
void main() {
clrscr();
coloredpoint pc(2,3,5);
cout<<"pc = ";
pc.display();
cout<<"coloredpoint qc = pc;\n";
coloredpoint qc = pc;
cout<<"qc= ";
qc.display();
getch();
}
-178-
Kü thuËt thõa kÕ
pc = Ham coloredpoint::display()
Goi ham point::display()
Toa do :2 3
Mau 5
coloredpoint qc = pc;
Goi
ham
thiet
lap
sao
chep
coloredpoint::coloredpoint(coloredpoint &)
qc= Ham coloredpoint::display()
Goi ham point::display()
Toa do :2 3
Mau 5
Trong thùc tÕ, ta th-êng sö dông mét c¸ch lµm kh¸c, gäi hµm thiÕt lËp sao
chÐp cña líp c¬ së trong ®Þnh nghÜa cña hµm thiÕt lËp sao chÐp líp dÉn xuÊt. C¸ch
tiÕp cËn nµy yªu cÇu ph¶i t¸ch cho ®-îc tham chiÕu ®Õn ®èi t-îng líp c¬ së ®Ó
dïng lµm tham sè cña hµm thiÕt lËp c¬ së.
Ta xÐt ®Þnh nghÜa hµm
coloredpoint::coloredpoint(coloredpoint&)
trong ch-¬ng tr×nh sau:
VÝ dô 5.6
/*inheri5.cpp*/
#include <iostream.h>
#include <conio.h>
class point {
float x,y;
public:
point() {x = 0; y = 0;}
point(float ox, float oy) {x = ox; y = oy; }
point(point &p) {x = p.x; y = p.y;}
void display() {
cout<<"Goi ham point::display() \n";
cout<<"Toa do :"<<x<<" "<<y<<endl;
}
void move(float dx, float dy) {
-179-
Kü thuËt thõa kÕ
x += dx;
y += dy;
}
};
/*líp coloredpoint thõa kÕ tõ point*/
class coloredpoint : public point {
unsigned int color;
public:
coloredpoint():point() {
color =0;
}
coloredpoint(float ox, float oy, unsigned int c):point(ox,oy) {
color = c;
}
coloredpoint(coloredpoint &b):point((point &)b) {
color = b.color;
}
void display() {
cout<<"Ham coloredpoint::display()\n";
point::display();
cout<<"Mau "<<color<<endl;
}
};
void main() {
clrscr();
coloredpoint m(2,3,5);
cout<<"Diem m \n";
m.display();
cout<<"coloredpoint p =m;\n";
coloredpoint p =m;
cout<<"Diem p \n";
p.display();
-180-
Tải về để xem bản đầy đủ
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình hướng đối tượng với C++ - Chương 5: Kỹ thuật thừa kế", để 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:
giao_trinh_lap_trinh_huong_doi_tuong_voi_c_chuong_5_ky_thuat.pdf

