Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (111.66 KB, 7 trang )
<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>
<b>chương 5</b>
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.ẽ ề ự ừ ế ủ ớ
<b>§ 1. S d n xu t và tính th a k ự ẫ</b> <b>ấ</b> <b>ừ</b> <b>ế</b>
<b>1.1. L p c s và l p d n xu tớ</b> <b>ơ ở</b> <b>ớ</b> <b>ẫ</b> <b>ấ</b>
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. Ngồ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:ộ ố ơ ồ ề ệ ẫ ấ ủ ớ
<b>S đ 1:ơ ồ</b> 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
<b>S đ 2:ơ ồ</b> L p A là c s c a các l p B, C và Dớ ơ ở ủ ớ
A
B C D
<b>S đ 3:ơ ồ</b> L p D d n xu t t 3 l p A, B, Cớ ẫ ấ ừ ớ
A B C
D
<b>S đ 4:ơ ồ</b> Lược đ d n xu t t ng quátồ ẫ ấ ổ
A B C
D E
F G H
<b>Tính th a k :ừ</b> <b>ế</b> 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. ừ ế ầ ủ ớ
<b>1.2. Cách xây d ng l p dân xu tự</b> <b>ớ</b> <b>ấ</b>
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ứ
} ;
<b>1.3. Th a k private và publicừ</b> <b>ế</b>
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. ừ ằ ự ừ ế
<i><b>Chú ý:</b></i> N u b qua khơng dùng t khố 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 public 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. ớ ơ ở ẽ ơ ầ ủ ớ ẫ ấ
<b>1.4. Th a k các thành ph n d li u (thu c tính)ừ</b> <b>ế</b> <b>ầ</b> <b>ữ ệ</b> <b>ộ</b>
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 .ộ ủ ớ ơ ở
<i><b>Chú ý:</b></i> 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.ớ ẫ ấ
<b>Ví d :ụ</b>
class A
{
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.ớ ộ
<b>1.5. Th a k phừ</b> <b>ế</b> <b>ương th cứ</b>
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.ớ ẫ ấ
<b>Ví d :ụ</b> 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ứ
<i><b>Chú ý</b></i> 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 <conio.h>
#include <iostream.h>
class DIEM
{
private:
double x, y;
public:
DIEM()
{
x = y =0.0;
}
DIEM(double x1, double y1)
{
x = x1; y = y1;
}
void in()
{
cout << "\nx= " << x << " y= " << y;
}
};
class HINH_TRON : public DIEM
{
private:
double r;
public:
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 << "\nHinh tron co tam: ";
h.in();
cout << "\nCo ban kinh= " << h.getR();
getch();
}
<b>1.6. L p c s và đ i tớ</b> <b>ơ ở</b> <b>ố ượng thành ph nầ</b>
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 trì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 <conio.h>
#include <iostream.h>
class DIEM
{
private:
double x, y;
public:
DIEM()
{
x = y =0.0;
}
DIEM (double x1, double y1)
{
x = x1; y = y1;
}
void in()
{
cout << "\nx= " << x << " y= " << y;
}
} ;
class HINH_TRON
{
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 << "\nHinh tron co tam: ";
cout << "\nCo ban kinh= " << h.getR();
getch();
}
<b>§ 2. Hàm t o, hàm hu đ i v i tính th a kạ</b> <b>ỷ ố ớ</b> <b>ừ</b> <b>ế</b>
<b> 2.1. L p d n xu t không th a k các hàm t o, hàm hu , toánớ</b> <b>ẫ</b> <b>ấ</b> <b>ừ</b> <b>ế</b> <b>ạ</b> <b>ỷ</b>
<b>t gán c a các l p c sử</b> <b>ủ</b> <b>ớ</b> <b>ơ ở</b>
<b>2.2. Cách xây d ng hàm t o c a l p d n xu tự</b> <b>ạ</b> <b>ủ ớ</b> <b>ẫ</b> <b>ấ</b>
+ Hàm t o c n có các đ i đ kh i gán cho các thu c tính (thànhạ ầ ố ể ở ộ
ph n d li u) c a l p.ầ ữ ệ ủ ớ
+ Có th phân thu c tính làm 3 lo i ng v i 3 cách kh i gánể ộ ạ ứ ớ ở
khác nhau:
1. Các thu c tính m i khai báo trong l p d n xu t. Trong cácộ ớ ớ ẫ ấ
phương th c c a l p d n xu t có th truy xu t đ n các thu c tínhứ ủ ớ ẫ ấ ể ấ ế ộ
này. Vì v y chúng thậ ường được kh i gán b ng các câu l nh gánở ằ ệ
viết trong thân hàm t o. ạ
2. Các thành ph n ki u đ i tầ ể ố ượng. Trong l p d n xu t khôngớ ẫ ấ
cho phép truy nh p đ n các thu c tính c a các đ i tậ ế ộ ủ ố ượng này. Vì
v y đ kh i gán cho các đ i tậ ể ở ố ượng thành ph n c n dùng hàm t oầ ầ ạ
c a l p tủ ớ ương ng. Đi u này đã trình b y trong m c ứ ề ầ ụ §8 ch ng 4. ươ
3. Các thu c tính th a k t các l p c s . Trong l p d n xu tộ ừ ế ừ ớ ở ở ớ ẫ ấ
không được phép truy nh p đ n các thu c tính này. Vì v y đậ ế ộ ậ ể
kh i gán cho các thu c tính nói trên, c n s d ng hàm t o c a l pở ộ ầ ử ụ ạ ủ ớ
c s . Cách th c cũng gi ng nh kh i gán cho các đ i tơ ở ứ ố ư ở ố ượng
thành ph n, ch khác nhau ch : Đ kh i gán cho các đ i tầ ỉ ở ỗ ể ở ố ượng
thành ph n ta dùng tên đ i tầ ố ượng thành ph n, còn đ kh i gán choầ ể ở
các thu c tính th a k t các l p c s ta dùng tên l p c s :ộ ừ ế ừ ớ ơ ở ớ ơ ở
Tên_đ i_tố ượng_thành_ph n(danh sách giá tr ) ầ ị
Tên_l p_c _s (danh sách giá tr ) ớ ơ ở ị
Danh sách giá tr l y t các đ i c a hàm t o c a l p d n xu tị ấ ừ ố ủ ạ ủ ớ ẫ ấ
đang xây d ngự
(xem ví d m c 2.4 và ụ ụ §6, ví d 1)ụ
<b>2.3. Hàm hu ỷ</b>
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 ph i là đ i tầ ế ộ ả ố ượng) khai
{
y.x[i]=0;
for (j=1; j<=n; ++j)
y.x[i] += a[i][j]*x.x[j];
}
return y;
}
void VT::nhap()
{
int n,i;
n = this->getN();
{
this->CAP::nhap();
n = this->getN();
}
for (i=1; i<=n; ++i)
{
cout << " PT thu " << i << " = ";
cin >> x[i];
}
}
void VT::xuat()
{
int n,i;
n = this->getN();
if (n)
{
cout << "\n";
for (int i=1; i<=n; ++i)
cout << x[i] << " ";
}
}
}
void main()
{
MT a; VT x,y;
clrscr();
cout<<"\nNhap ma tran A:";
a.nhap();
cout<<"\n\nNhap Vec to X:\n";
x.nhap();
y = a*x;
cout<<"\n\nMa tran A";
a.xuat();
cout<<"\n\nVec to X";
x.xuat();
cout<<"\n\nVec to Y=AX";
y.xuat();
getch();
}
<b>§ 12. Toàn th và b ph nể</b> <b>ộ</b> <b>ậ</b>
Thông thường khi xem xét, gi i quy t m t bài toán, ta thả ế ộ ường
chia nó thành các bài tốn nh h n. Nói cách khác: M t bài toán l nỏ ơ ộ ớ
bao g m nhi u bài toán b ph n. Khi đó ta có th đ nh nghĩa cácồ ề ộ ậ ể ị
l p cho các bài toán b ph n. L p cho bài toán chung đớ ộ ậ ớ ược d nẫ
xu t t các l p nói trên.ấ ừ ớ
Xét m t thí d đ n gi n là bài tốn qu n lý th vi n. Nó g m 2ộ ụ ơ ả ả ư ệ ồ
bài toán b ph n là qu n lý sách và qu n lý đ c gi . Chúng ta sộ ậ ả ả ọ ả ẽ
xây d ng l p SACH và l p DOC_GIA. Sau đó dùng các l p nàyự ớ ớ ớ