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  
mua(q)  
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  
chªnh lÖch gi¸ b¸n
-
 
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  
lanh  
thêi h¹n b¶o hµnh  
c¸c ph-¬ng thøc  
thêi gian b¶o hµnh  
Líp Tivi  
Líp ¤t«  
c¸c thuéc tÝnh  
kÝch th-íc mµn h×nh  
®iÒu khiÓn tõ xa  
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 đủ
pdf 74 trang Thùy Anh 20540 Free
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:

  • pdfgiao_trinh_lap_trinh_huong_doi_tuong_voi_c_chuong_5_ky_thuat.pdf